昨天看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...
3.5.1 Hibernate的初始化 61 3.5.2 访问Hibernate的Session接口 63 3.6 运行helloapp应用 67 3.6.1 创建运行本书范例的系统环境 67 3.6.2 创建helloapp应用的目录结构 72 3.6.3 把helloapp应用作为独立应用程序...