今天在项目运行过程中,一直报一个org.hibernate.exception.GenericJDBCException: could not insert 异常,Root Cause是IBM  DB2 ErrorCode=-180,sqlstate=22007,经过Google,发现这个错误的原因是因为Timestamp的格式不规范导致,但是具体是哪一项,却不太清楚,如果能够打印出导致问题的SQL语句,那么对于这类问题的定位就会非常容易了。 

      在Hibernate的配置文件hibernate.cfg.xml中有3个设置项跟显示SQL语句相关,他们的值都是boolean值: 
    (1)、show_sql:是否显示SQL语句 
    (2)、format_sql: 是否格式化输出字符串,增强SQL的可读性 
    (3)、use_sql_comments:是否显示注释,用于指示出是什么操作产生了这个SQL语句。 
    
     在默认情况下,Hibernate会把SQL语句打印在Console上,因此在开启了上面的设置之后,可以在控制台上看到如下结构的SQL语句:

  1. /* load collection cc.unmi.test.model.Post.securities */ select  

  2.        securities0_.post_id as post1_7_1_,  

  3.        security1_.shareclassid as sharecla1_16_0_,  

  4.        security1_.company_id as company2_16_0_,  

  5.    from  

  6.        Post_Security_Relationship securities0_  

  7.    inner join  

  8.        unmi.securities security1_  

  9.            on securities0_.shareclassid=security1_.shareclassid  

  10.    where  

  11.        securities0_.post_id=?  


   可以发现,在控制台上根本看不到,SQL语句对应的参数,一般情况下,Hibernate都会和Log4j配合使用,这样就可以更加灵活的控制hibernate的日志文件输出。在hibernate中,默认的关于SQL语句对应参数的输出级别为TRACE,比默认的Log4j的日志等级DEBUG还要低一等级,因此,为了显示参数,还需手动设置一下log4j的配置,把hibernate下的输出等级改为TRACE: 
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 
log4j. loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE  
这样修改之后,打印的SQL语句会变为如下形式:

    网友评论