Hibernate调试——定位查询源头
本文是我在importNew翻译的文章,首发在importNew,这里会定期更新链接。
为什么有时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界面并从头到尾运行一遍。这样在调用栈中将会出现查询操作在何处被创建。
Hibernate调试——定位查询源头的更多相关文章
- hibernate框架之-查询结果集返回类型
Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- thinkphp 定位查询 Model:last您所请求的方法不存在!
thinkphp 定位查询 Model:last您所请求的方法不存在! 用thinkphp3.1做项目的时候为了获取记录表中最后一个id用到了last()方法,出现了这个错误:Model:last ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate应用SQL查询返回实体类型
Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
随机推荐
- python面试题解析(数据库和缓存)
1. 答: 关系型数据库:Mysql,Oracel,Microsoft SQL Server 非关系型数据库:MongoDB,memcache,Redis. 2. 答: MyI ...
- 初试webpack打包
第一次接触webpack,学习了如何用webpack打包,记录一下过程. 1.在项目根目录安装webpack $ npm install webpack --save-dev 2.新建一个webpac ...
- Appscan安全漏洞扫描使用(转)
这里主要分享如何使用AppScan对一大项目的部分功能进行安全扫描. ----------------------------------------------------------------- ...
- Leetcode 446.等差数列划分II 子序列
等差数列划分II 子序列 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, ...
- ES6 异步编程之一:Generator
Generator 生成器是es6原生提供的异步编程方案,其语法行为和传统函数完全不同,阮大的<ECMAScript 6 入门>一书中对生成器有比较详尽的介绍,还有一些其他的文章可以参考, ...
- Java 线程池的原理与实现学习(三)
一简介 线程的使用在java中占有极其重要的地位,jdk1.4及其之前的jdk版本,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观,Jdk1.5之后加入了java.util.c ...
- 头脑王者pk答题小程序开发思路 微信pk答题小程序开发 PK答题游戏你也可以做 微信pk答题游戏
想必大家最近的朋友圈和微信群里都被头脑王者PK答题刷屏了吧.确实很好玩,尤其是2018年的这波风口,手机答题,大家掏出手机,创建一个好友PK,然后你的好友点击进来就可以和你一起PK答题.比之前的游戏好 ...
- 【python接口自动化】logger
#! /usr/bin/env python # coding=GBK import logging, os class Logger: def __init__(self, path, clevel ...
- poj 3109
...
- 转 python语法学习面向对象之继承
传送门 python语法学习面向对象之继承 只要涉及到面向对象,”类“是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念: 包括初始 ...