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

休眠调试–查找查询的来源相关推荐

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

    hibernate 调试 Hibernate为何在程序的哪个部分以及在哪个部分中生成给定SQL查询并不总是立即的,尤其是当我们处理的是我们自己编写的代码时. 这篇文章将介绍如何配置Hibernate查 ...

  2. UPack调试——查找OEP

    UPack调试--查找OEP OD运行错误 解码循环 设置IAT 参考文献 OD运行错误 OD直接加载会报错,通过Stud_PE确定EP虚拟地址: 并在OD中通过New origin here命令进行 ...

  3. [译]如何在C#中调试LINQ查询

    LINQ是我在C#中最喜欢的功能之一.它让代码看起来更漂亮美观.我们得到了一个易于编写和理解的简洁函数式语法.好吧,至少我们可以使用LINQ方法的语法风格. LINQ很难进行调试.我们无法知道该查询内 ...

  4. 一个漂亮的Bootstrap查找查询框,带下拉选择按钮

    闲话少叙,代码如下: <!doctype html> <html><head> <meta http-equiv="Content-Type&quo ...

  5. 搜图出处的软件_【识图】怎样查找图片的来源出处,又快又好

    我们要是再网上看到一些电影的图片,却不知道是来自哪部电影,这个应该用什么工具来识别呢?今天来分享怎么识别图片出处. 工具/材料 ·搜狗识图 ·互联网 操作方法 01 首先我们需要进入到搜狗浏览器的主页 ...

  6. JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置

    日常的网页开发调试工作中,经常需要知道指定的某个网页元素绑定了哪些事件以及绑定代码的位置,下面介绍三种用来跟踪页面中的事件的方法. 1.使用firefox调试 我们可以使用firefox的debug工 ...

  7. oracle 等待原因查找,查询引起锁等待的SQL语句

    本帖最后由 bfc99 于 2014-9-22 17:34 编辑 主要通过四个性能视图: 1.v$locked_object  查看当前哪些对象上有锁,及其所属的会话. 2.v$session_blo ...

  8. Internal error: : 8 [#1] PREEMPT SMP ARM,vmlinux反汇编命令调试查找错误的步骤

    自己遇到的错误日志: [    1.287838] ap3216c 0-001e: ap3216c init failed [    1.292450] ap3216c: probe of 0-001 ...

  9. php查询后台地址,dedecms 织梦后台查找方法【整理】

    换友链感悟,有些逗比开了个换链VIP有了超级申请,就和个逗比一样.什么样的站都去申请,烦的很.自己什么样的站自己都不管理好就出来换链了.随便一查.BR1 词库数量30. 这个都还正常. 再一site/ ...

最新文章

  1. 【libevent】libevent库学习总结(一)——基础
  2. 有空间感的图片环形滚动代码
  3. 一款简洁大气的jquery日期日历插件
  4. spyder ipython控制台_Spyder Ipython控制台完全忽略打印语句
  5. 读取当前linux进程内存_(笔记)Linux上的内存分配
  6. Android service 小研究
  7. android 短信编解码方式,中移短信cmpp协议/smpp协议 netty实现编解码
  8. 【机器学习】监督学习--(分类)决策树②
  9. Android查看CPU和GPU使用率
  10. 批量下载哨兵数据的方法探索
  11. PDFEdit编辑器使用教程为PDF增加封面
  12. linux缺少libeds.so,OpenSSL鏈接libcrypto.a以靜態方式
  13. 智慧工厂管理平台建设,智慧工厂管理系统开发
  14. 测试电梯的测试用例_测试面试题之如何测试电梯
  15. 二、循环神经网络(RNN与LSTM)
  16. 81、【backtrader基金策略】如果每周定投一次,在周几定投收益率更高?
  17. 某程序员:这辈子再也不想为谁拼刀刀了!
  18. 3DTouch桌面快捷方式
  19. 搭建oa服务器后怎么接入到微信,微信oa是什么?微信如何与OA进行结合?
  20. hillin:浮木漂流

热门文章

  1. Android 对话框,确定取消
  2. alertmanager 告警恢复_Prometheus配置企业微信告警
  3. kafka消费者接收分区测试
  4. thinking-in-java(19)枚举类型
  5. maven 构建增量包_使用Maven进行增量构建
  6. graphql 有必要吗_您准备好观看GraphQL了吗?
  7. java 函数式编程_Java函数式编程:Javaslang入门
  8. 在雅加达EE TCK中使用Arquillian的可能方法
  9. c 遍历文件 递归遍历_将递归文件系统遍历转换为流
  10. 使用Gradle构建Monorepo项目