今天在項(xiàng)目運(yùn)行過程中,一直報(bào)一個(gè)org.hibernate.exception.GenericJDBCException: could not insert 異常,Root Cause是IBM DB2 ErrorCode=-180,sqlstate=22007,經(jīng)過Google,發(fā)現(xiàn)這個(gè)錯(cuò)誤的原因是因?yàn)門imestamp的格式不規(guī)范導(dǎo)致,但是具體是哪一項(xiàng),卻不太清楚,如果能夠打印出導(dǎo)致問題的SQL語(yǔ)句,那么對(duì)于這類問題的定位就會(huì)非常容易了。
在Hibernate的配置文件hibernate.cfg.xml中有3個(gè)設(shè)置項(xiàng)跟顯示SQL語(yǔ)句相關(guān),他們的值都是boolean值:
(1)、show_sql:是否顯示SQL語(yǔ)句
(2)、format_sql: 是否格式化輸出字符串,增強(qiáng)SQL的可讀性
(3)、use_sql_comments:是否顯示注釋,用于指示出是什么操作產(chǎn)生了這個(gè)SQL語(yǔ)句。
在默認(rèn)情況下,Hibernate會(huì)把SQL語(yǔ)句打印在Console上,因此在開啟了上面的設(shè)置之后,可以在控制臺(tái)上看到如下結(jié)構(gòu)的SQL語(yǔ)句:
/* load collection cc.unmi.test.model.Post.securities */ select
securities0_.post_id as post1_7_1_,
security1_.shareclassid as sharecla1_16_0_,
security1_.company_id as company2_16_0_,
from
Post_Security_Relationship securities0_
inner join
unmi.securities security1_
on securities0_.shareclassid=security1_.shareclassid
where
securities0_.post_id=?
可以發(fā)現(xiàn),在控制臺(tái)上根本看不到,SQL語(yǔ)句對(duì)應(yīng)的參數(shù),一般情況下,Hibernate都會(huì)和Log4j配合使用,這樣就可以更加靈活的控制hibernate的日志文件輸出。在hibernate中,默認(rèn)的關(guān)于SQL語(yǔ)句對(duì)應(yīng)參數(shù)的輸出級(jí)別為TRACE,比默認(rèn)的Log4j的日志等級(jí)DEBUG還要低一等級(jí),因此,為了顯示參數(shù),還需手動(dòng)設(shè)置一下log4j的配置,把hibernate下的輸出等級(jí)改為TRACE:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j. loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE
這樣修改之后,打印的SQL語(yǔ)句會(huì)變?yōu)槿缦滦问剑?/p>