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. 声明与已声明不兼容_中兴今日发声明:专注芯片设计 不具备芯片制造能力
  2. linux下常用关机命令
  3. poi写入Excel
  4. 屏幕编程 F4的帮组用法
  5. linux 查询oracle情况,在Linux下使用SQLPlus查看Oracle数据库表空间及使用率
  6. 微信暂停新用户注册标志一个时代的结束
  7. Java 面试之数据结构
  8. 网络-IP/子网掩码/端口
  9. xcopy远程linux复制,window下批处理操作:从Linux机器下拷贝文件
  10. 转Win 7 快捷键
  11. 使用Proj.Net创建空间参考
  12. 一道金蝶校园招聘试题数据库笔试题
  13. 解决魅族手机不能Toast提示的方法
  14. 制造型企业呼叫中心搭建-SDCC呼叫中心
  15. C# webbrowser爬虫中经常碰到的脚本错误弹出窗口的问题解决
  16. LabVIEW编程LabVIEW开发 控制NI USB-6225例程与相关资料
  17. 千杯酒中检测那一杯毒酒的问题及思考
  18. 阿里巴巴算法岗编程题:菜鸟仓库
  19. java实现条形图_java – 使用Apache POI在Excel中创建条形图
  20. 旭日图(Sunburst)

热门文章

  1. Linux中打包和解压到的方法
  2. php 输出01,php基础01_thinkphp输出Hello World-Go语言中文社区
  3. c传给php数据解包,小程序源码提取工具,完美解包,一键提取小程序源代码工具_PHP源码...
  4. oracle 更新参数,Oracle动态、静态参数参数修改规则
  5. python tkinter 背景色改变不了_python - Tkinter背景颜色问题 - 堆栈内存溢出
  6. 如何实现下拉框的绑定
  7. 反射和配置文件的实际应用
  8. lombok var_使用var,Lombok和Fluxtion轻松处理事件
  9. gc 堆外_GC解释:堆
  10. payara 创建 集群_高可用性(HA),会话复制,多VM Payara群集