hibernate 调试_Hibernate调试–查找查询的来源

hibernate 调试

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记录的是Hibernate发送到JDBC驱动程序的准备好的语句及其参数。 准备好的陈述有? 在准备好的语句下面,将代替查询参数记录参数值本身。

这与发送到数据库的实际查询不同,因为Hibernate无法记录实际查询。 原因是Hibernate只知道准备好的语句以及它发送给JDBC驱动程序的参数,而驱动程序将构建实际的查询,然后将其发送到数据库。

为了使用实际查询生成日志,需要使用log4jdbc之类的工具,该工具将是另一篇文章的主题。

如何找出查询的来源

上面记录的查询包含一个注释,该注释可以在大多数情况下标识查询的来源:如果查询是由于按ID加载而引起的,则注释为/* load your.entity.Name */ ,如果它是命名查询,则注释将包含查询的名称。

如果是一对多的延迟初始化,则注释将包含类的名称和触发它的属性,等等。

设置Hibernate查询日志

为了获得查询日志,需要在会话工厂的配置中设置以下标志:

<bean id= "entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
  ...
  <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
    }
    ...
}

遇到断点时,请转到包含程序的堆栈调用的IDE调试视图,并从上至下进行遍历。 在程序中进行查询的位置将在调用堆栈中。

翻译自: https://www.javacodegeeks.com/2014/06/hibernate-debugging-finding-the-origin-of-a-query.html

hibernate 调试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值