`

Hibernate(十八): Hibernate初始化时如何生成SQL语句?

阅读更多

    昨天看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.

5
1
分享到:
评论
2 楼 rmn190 2009-06-17  
针对注解,我没有专门做同样的实验,不过记得当时debug时,发现解析注解配置信息时,有专门一个类,觉得那个子类里应该有相关信息。
1 楼 flyingcai 2009-06-16  
我试过用注解的话,好象不能生效,不知道博主有没有试过。

相关推荐

    Hibernate使用xdoclet生成映射文件和sql语句

    - XDoclet可以生成基于实体类的数据库表创建脚本,这在初始化数据库或者迁移时非常有用。 - SQL脚本通常包括了创建表、索引、外键等操作,使得数据库结构与Java对象保持一致。 4. **XDoclet的局限性**: - 随着...

    精通Java EE项目案例--基于Eclipse Spring Struts Hibernate (例子中的初始化SQL)

    本资源“精通Java EE项目案例--基于Eclipse Spring Struts Hibernate (例子中的初始化SQL)”正是针对这样的集成环境提供了一套完整的数据库初始化语句,帮助开发者快速构建一个功能完善的Web应用。 首先,让我们...

    Hibernate在Myeclipse下SQL语句演示

    4. **SessionFactory**: 创建Session的工厂,负责配置和初始化Hibernate环境。 5. **HQL**: Hibernate特有的查询语言,类似于SQL,但操作对象是Java对象,而非数据库表。 6. **Criteria查询**: 一种面向对象的查询...

    Hibernate案例:办公自动系统

    - SessionFactory:是线程安全的,负责创建Session实例,它是Hibernate的核心,只在应用启动时初始化一次。 - Criteria API:提供了一种动态构建查询的方式,无需编写SQL,提高了代码的可读性和可维护性。 - HQL...

    hibernate的jar包

    在Java应用程序中,Hibernate作为对象关系映射(ORM)工具,使得开发者可以通过处理Java对象来间接操作数据库,无需直接编写SQL语句。下面将详细介绍Hibernate框架的核心组件、功能以及如何在项目中使用Hibernate的...

    SQL语句拼接

    2. **初始化StringBuffer**: ```java StringBuffer sql = new StringBuffer(); ``` 创建了一个`StringBuffer`对象,用于存放最终拼接完成的SQL语句。 3. **添加基础SQL语句**: ```java sql.append("select ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”)  16.3.6 迫切左外连接检索(fetch属性为“join”)  16.4 多对一和一对一关联的检索策略  16.4.1 迫切左外连接检索(fetch...

    DmDialect-for-hibernate4.0.zip

    达梦方言则是专门为Hibernate定制,使得Hibernate可以理解和优化针对达梦数据库的SQL语句,从而提高性能和兼容性。 在SpringBoot集成Hibernate时,通过配置`spring.jpa.hibernate.dialect`属性,指定使用DmDialect...

    hibernate3连接sql server的例子

    在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以用Java对象来操作数据库,而无需直接编写SQL语句。本例将详细介绍如何使用Hibernate 3连接到SQL Server数据库...

    hibernate_3.2官方开发包

    13. **查询优化**:Hibernate提供了SQL生成器,可以根据不同的数据库生成最优的SQL语句,同时支持批处理操作,提高性能。 这个“hibernate_3.2官方开发包”包含了源码、文档、示例等,可以帮助开发者深入了解...

    hibernate-lib。rar

    通过将Java对象与数据库表进行映射,开发者可以使用面向对象的方式来处理数据库操作,无需编写大量的SQL语句。 2. Hibernate核心库: “lib”文件夹中的jar包包含了Hibernate运行所必需的类库,主要包括以下几个...

    hibernate第一个hibernate

    Hibernate是一个开源的Java库,它提供了一种在Java应用中持久化数据的方式,使得开发者无需编写大量的SQL语句,即可实现对数据库的CRUD(创建、读取、更新和删除)操作。它的核心理念是将面向对象的模型映射到传统...

    hibernate-release-5.4.25.Final_Hibernate5.4.25_hibernate所需jar包_源

    - SessionFactory:初始化时创建,是所有数据库会话的工厂,用于创建Session对象。 - Session:负责执行CRUD操作,是与数据库交互的主要接口。 - Query与Criteria API:用于执行HQL或SQL查询,提供更加灵活的查询...

    hibernate-5.2.10最新jar包

    - Configuration:配置对象,负责加载hibernate.cfg.xml配置文件,初始化SessionFactory。 - SessionFactory:会话工厂,是线程安全的,负责创建Session对象。 - Session:持久化操作的主要接口,代表了一次...

    hibernate数据包

    ORM框架允许开发者使用面向对象的编程模型来处理数据库交互,而无需直接编写SQL语句,从而提高了开发效率和代码可读性。在这个“hibernate数据包”中,我们重点关注的是`hibernate-annotations-3.4.0.GA`这个子文件...

    Hibernate入门案例源码

    4. 初始化SessionFactory:在应用程序启动时,根据配置文件创建SessionFactory实例,它是线程安全的,整个应用程序只需要一个。 5. 使用Session:通过SessionFactory获取Session实例,进行数据库操作。 案例中的源...

    Hibernate自动生成表demo

    最后,为了使Hibernate根据实体类自动生成表,我们需要初始化SessionFactory并进行一些数据库操作。以下是一个简单的启动代码示例: ```java import org.hibernate.SessionFactory; import org.hibernate.boot....

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”)  16.3.6 迫切左外连接检索(fetch属性为“join”)  16.4 多对一和一对一关联的检索策略  16.4.1 迫切左外连接检索(fetch...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”)  16.3.6 迫切左外连接检索(fetch属性为“join”)  16.4 多对一和一对一关联的检索策略  16.4.1 迫切左外连接检索(fetch...

Global site tag (gtag.js) - Google Analytics