hibernate debug学习总结

时间:2022-02-11 03:32:59

Hibernate的Debug设置


If you want to see SQL binding value, just do as follows:
1.  set properties
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
2.  log4j
    log4j.logger.org.hibernate.type=debug
========

怎么让Hibernate不打印日志?

    我使用Log4j来打印日志的,但每次对数据库操作都会打印一大堆Hibernate3.2的日志【Debug级别】,把有用的信息都给淹没了,相当烦人。。。

    我做了以下几件事,都不能屏蔽hibernate的【Debug】日志:
    1:在Log4j.properties(位于src目录下)里面添加以下配置信息:
    log4j.logger.net.sf.hibernate=ERROR

    ### log JDBC bind parameters ###
    log4j.logger.org.hibernate=ERROR
    log4j.logger.org.hibernate.type=ERROR

    ### log schema export/update ###
    log4j.logger.org.hibernate.SQL=ERROR
    log4j.logger.org.hibernate.hql.ast.AST=ERROR
    log4j.logger.org.hibernate.tool.hbm2ddl=ERROR
    log4j.logger.org.hibernate.hql=ERROR
    log4j.logger.org.hibernate.cache=ERROR
    log4j.logger.org.hibernate.transaction=ERROR
    log4j.logger.org.hibernate.jdbc=ERROR
    log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=ERROR

    2:当尝试删除Log4j.properties,所有的日志都不打印了,包括自己添加的日志和Hibernate的日志。

    3:将slf4j-api-1.6.4.jar和slf4j-log4j12-1.6.4.jar放到Lib目录下,并添加进Java Build Path。

    4:删除commons-logging.jar

    请问基于以上的这些试验,我的问题该如何解决,谢谢!

    将级别有debug提高到info

    在Log4j.properties里吗?我已经搞成INFO了,可还是不行
    log4j.rootLogger=INFO,A1,R

    你清楚一下 缓存重启才行。

    请问怎么清除缓存啊?
    我clean了一下编译结果,重新运行还是不行。
========

hibernate日志配置  


在hibernate使用的日志标准都为slf,slf可以看作为它的接口,因此需要找到它的实例,为我们做日志。

我们选择使用log4j为实例。

1、 为防止冲突,先将slf4j-nop的jar包(它也是slf的一个实例)去除
2、 加入log4j的jar包。
3、 加入转换包 slf4j-log4j  
4、 src下假如log4j.properties 配置文件

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug  //可关闭,使用了debug跟踪整个程序数据连接的每一步过程

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL 仅输出SQL语句
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug   //跟踪输出,JDBC参数查询的日志

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
========

Hibernate调试——定位查询源头


本文由 ImportNew - jessenpan 翻译自 javacodegeeks。欢迎加入翻译小组。转载请见文末要求。

为什么有时Hibernate会在程序某一部分生成一条指定sql查询?这个问题让人很难立刻理解,当处理不是我们本人编写的代码时更是如此。

本文将展示如何配置来产生Hibernate查询操作的日志。通过这些日志和一些小技巧来找出这些指定的查询为什么及在何处被执行。
Hibernate查询日志格式

Hibernate内建的查询日志格式如下:
    
select /* load your.package.Employee */ this_.code, ...
from employee this_
where this_.employee_id=?
 
TRACE 12-04-2014@16:06:02  BasicBinder - binding parameter [1] as [NUMBER] - 1000
为什么Hibernate不能记载最终的查询日志?

需要注意的是,Hibernate只记录从它发送到JDBC的准备语句(prepared statement)及参数。准备语句使用“?”作为查询参数的占位符,这些参数的实际值被记录在准备语句的下方。

这些准备语句和最终发送到数据库的sql语句是不同的,对于这些最终的查询操作Hibernate无法记录。出现这种情况的原因是Hibernate只知道它发送给JDBC的准备语句和参数,实际的查询是由JDBC构建并发送给数据库的。

为了产生实际查询的日志,像log4jdbc这种工具是必不可少的,这里不会讨论如何使用log4jdbc。
如何找到原始查询操作

上述的可记录查询包含一条标注,在大多数情况下它可以标识某条起始查询语句。如果一条查询是由加载引起的,那么标注便是/*load your.entity.Name*/。如果是一条命名查询,那么标注则包含查询的名称。

如果它是一个对应许多延迟加载的查询,标注则会包含对应类的名称和引发该操作的属性值等。
设置Hibernate的查询日志

为了获得查询日志,需要将如下标签加入会话工厂的配置文件中:
    
<bean id= "entityManagerFactory" >
  ...
  <property name="jpaProperties" >
  <props>
      <prop key="hibernate.show_sql" >true</ prop>
      <prop key="hibernate.format_sql" >true</ prop>
      <prop key="hibernate.use_sql_comments">true</prop>
  </props>
</property>

上面的示例展示了Spring实体管理工厂的配置。下面是对一些标签的解释:

    show_sql:激活查询日志功能。
    format_sql:优雅地输出Sql。
    use_sql_comments:添加一条解释型标注。

为了记录查询语句的参数信息,log4j或者相对应的信息是需要的。
    
<logger name="org.hibernate.type">
    <level value="trace" />
</logger >
如果上述功能都不能运行

在大多数情况下,use_sql_comments创建的标注是足够用来标识查询的起始。但如果这还不够,我们可以标识和数据表名相关联的查询返回的实体,并在返回的实体构造函数中设置断点。

如果一个实体没有构造函数,我们可以创建一个构造函数并把断点设置在super()函数调用中。
    
@Entity
public class Employee {
    public Employee() {
        super(); // put the breakpoint here
    }
    ...
}

设置断点后,跳转到包含程序堆栈信息的Debug界面并从头到尾执行一遍。这样在调用栈中将会出现查询操作在何处被创建。
原文链接: javacodegeeks 翻译: ImportNew.com - jessenpan
译文链接: http://www.importnew.com/12303.html
========
http://blog.csdn.net/chszs/article/details/46482297
在Hibernate中开启日志