昨天看Hibernate方面书时又看到了"dynamic
-update
=true"的配置.
在一个Model类的Mapping中设置它后, hibernate在初始化时就不再为此Model类生成更新语句了,
默认是生成的(至于什么情况下设置此选择这个问题,这里就不赘述了).也说不清什么原因,
突然想看下不设置此选项时,hibernate究竟怎么生成更新语句的, 毕竟眼见为实嘛,虽说以前无数次地见到书上/文档里/同事们都这么说.
再加上自己向来对Hibernate源码研究情有独钟(请见Hibernate源码研究碎得整理(一到十三)
). 说实话,以前这样想看SQL是怎么生成的话题想不出,即使想出来也无从下手. N长时间的思考/折磨/挣扎/痛定思痛的沉淀后, 觉得自己现在可以试它一试了.
环境搭建很简单,这里不再赘述. 这里以一个Model类来说明:Person类及Person.hbm.xml配置文件. Person类很简单就三个属性(id,name,age),配置文件也就很简单了.
.......Eclipse下设置断点跟踪........
1,生成一个Configuration对象时,没发现可疑代码.(心情log: 兴致勃勃,肯定能找到,见证这"辉煌时刻"吧!)
2,解析hibernate.cfg.xml配置文件时,也没发现可疑代码. (心情log:配置文件解析完了,怎么还没有呢?
有些纳闷了:我要的代码,你在哪?
不过有收获:PersistentClass类里有这么个方法useDynamicUpdate,于是在这"布控"了断点,虽然现在还没生成想要的SQL
语句,不过,想信真正生成时hibernate会调用这个方法)
3,由于上面在认为关键代码上"布控"了断点,
于是Eclipse中直接按了F8,不出所料在上面useDynamicUpdate方法时设置断点处停了下来.
原来是在Configuration在buildSessionFactory时给Person类生成一个EntityPersister时停的.于是,
集中看EntityPersister当前实现类的SingleTableEntityPersister的构造方法.
这个构造方法里先调用了父类AbstractEntityPersister的构造方法(父类构造方法很长,有300来行),
一步步跟踪看父类构造方法执行完了,还是看到SQL的生成,SQL生成这样的方法很公用的不用放到具体子类来执行吧?
父类构造方法中没发现,有些气馁了.
再看子类构造方法(同样长,也是300行),
一步步执行,看到了很像的customSQLUpdate,但不是(这里记下来,这个属性代表什么?). 眼看要执行完了,还是没发现.
难道自己的猜测不对? 在子类构造方法最后一类,发现了这么一个方法调用 postConstruct.直觉告诉我,有戏!
再看它是父类里的方法,更坚定了信心. 于是, 情况朝对自己有利的方向发展了:
见到了sqlUpdateStrings(感觉像猎人发现了猎物的足迹),发现了顾名思义的方法generateUpdateString
调用! 接下来的事就水到渠成了.
终于看到可爱的update语句了: update Person set name=?, age=? where id=?
............................................
总结下发现updateSQL过程中的关键点,用兴趣的看官可设置断点体会下:
1, 调用环境: 父类AbstractEntityPersister中的postConstruct方法.
2, 最终生成: org.hibernate.sql.Update类中toStatementString方法.
以上是updae语句的生成,其余insert/delete语句如出一辙,不过相应具体类换成了Insert/Delete.
分享到:
相关推荐
- XDoclet可以生成基于实体类的数据库表创建脚本,这在初始化数据库或者迁移时非常有用。 - SQL脚本通常包括了创建表、索引、外键等操作,使得数据库结构与Java对象保持一致。 4. **XDoclet的局限性**: - 随着...
本资源“精通Java EE项目案例--基于Eclipse Spring Struts Hibernate (例子中的初始化SQL)”正是针对这样的集成环境提供了一套完整的数据库初始化语句,帮助开发者快速构建一个功能完善的Web应用。 首先,让我们...
4. **SessionFactory**: 创建Session的工厂,负责配置和初始化Hibernate环境。 5. **HQL**: Hibernate特有的查询语言,类似于SQL,但操作对象是Java对象,而非数据库表。 6. **Criteria查询**: 一种面向对象的查询...
- SessionFactory:是线程安全的,负责创建Session实例,它是Hibernate的核心,只在应用启动时初始化一次。 - Criteria API:提供了一种动态构建查询的方式,无需编写SQL,提高了代码的可读性和可维护性。 - HQL...
在Java应用程序中,Hibernate作为对象关系映射(ORM)工具,使得开发者可以通过处理Java对象来间接操作数据库,无需直接编写SQL语句。下面将详细介绍Hibernate框架的核心组件、功能以及如何在项目中使用Hibernate的...
2. **初始化StringBuffer**: ```java StringBuffer sql = new StringBuffer(); ``` 创建了一个`StringBuffer`对象,用于存放最终拼接完成的SQL语句。 3. **添加基础SQL语句**: ```java sql.append("select ...
16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对一和一对一关联的检索策略 16.4.1 迫切左外连接检索(fetch...
达梦方言则是专门为Hibernate定制,使得Hibernate可以理解和优化针对达梦数据库的SQL语句,从而提高性能和兼容性。 在SpringBoot集成Hibernate时,通过配置`spring.jpa.hibernate.dialect`属性,指定使用DmDialect...
在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以用Java对象来操作数据库,而无需直接编写SQL语句。本例将详细介绍如何使用Hibernate 3连接到SQL Server数据库...
13. **查询优化**:Hibernate提供了SQL生成器,可以根据不同的数据库生成最优的SQL语句,同时支持批处理操作,提高性能。 这个“hibernate_3.2官方开发包”包含了源码、文档、示例等,可以帮助开发者深入了解...
通过将Java对象与数据库表进行映射,开发者可以使用面向对象的方式来处理数据库操作,无需编写大量的SQL语句。 2. Hibernate核心库: “lib”文件夹中的jar包包含了Hibernate运行所必需的类库,主要包括以下几个...
Hibernate是一个开源的Java库,它提供了一种在Java应用中持久化数据的方式,使得开发者无需编写大量的SQL语句,即可实现对数据库的CRUD(创建、读取、更新和删除)操作。它的核心理念是将面向对象的模型映射到传统...
- SessionFactory:初始化时创建,是所有数据库会话的工厂,用于创建Session对象。 - Session:负责执行CRUD操作,是与数据库交互的主要接口。 - Query与Criteria API:用于执行HQL或SQL查询,提供更加灵活的查询...
- Configuration:配置对象,负责加载hibernate.cfg.xml配置文件,初始化SessionFactory。 - SessionFactory:会话工厂,是线程安全的,负责创建Session对象。 - Session:持久化操作的主要接口,代表了一次...
ORM框架允许开发者使用面向对象的编程模型来处理数据库交互,而无需直接编写SQL语句,从而提高了开发效率和代码可读性。在这个“hibernate数据包”中,我们重点关注的是`hibernate-annotations-3.4.0.GA`这个子文件...
4. 初始化SessionFactory:在应用程序启动时,根据配置文件创建SessionFactory实例,它是线程安全的,整个应用程序只需要一个。 5. 使用Session:通过SessionFactory获取Session实例,进行数据库操作。 案例中的源...
最后,为了使Hibernate根据实体类自动生成表,我们需要初始化SessionFactory并进行一些数据库操作。以下是一个简单的启动代码示例: ```java import org.hibernate.SessionFactory; import org.hibernate.boot....
16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对一和一对一关联的检索策略 16.4.1 迫切左外连接检索(fetch...
16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对一和一对一关联的检索策略 16.4.1 迫切左外连接检索(fetch...