`

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:Java 对象持久化技术详解(第2版).part2

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

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

    这是这本书中所有的数据库初始化语句,这样,整本书的教程都已经上传完了,祝你学习愉快!

    精通 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...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    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应用作为独立应用程序...

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

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

    精通Hibernate:对象持久化技术第二版part3

    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应用作为独立应用程序...

    Hibernate体系结构的概要图

     SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只...

    Hibernate注解

    * 主表:?@OneToOne(cascade = CascadeType.ALL) * @JoinColumn(name="主表外键") //这里指定的是数据库中的外键字段。 * public 从表类 get从表类(){return 从表类} * 从表:@OneToOne(mappedBy = "主表类中的从表...

    hibernate 完整教程 自学

     SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个...

    hibernate总结

    b) 在内存中,如果有多个set(代理)容器需要初始化, 则当访问任何一个代理set容器时,一次初始化n个set容器,减少sql语句; c) 产生的语句是:select * from ….. where FK in (?,?,?... …n); 3. 迫切(fetch)左外...

    jdbc基础和参考

    执行sql语句: execute:返回boolean类型的值,代表是否有结果集返回(如果执行select操作,是有ResultSet的,返回值为true) executeUpdate:返回int类型的值,代表的是,操作执行完成后,受影响的数据库的行计数...

    s2sh + extjs4 办公平台架构

    4、使用p6spy 打印出hibernate 中已经替换了占位符参数的sql语句,为hibernate的调试不在感到苦恼 系统部署我使用的ant 部署,代码包含ant部署文件 skyline\coding\src\config\jdbc.properties 为数据库配置...

    java面试宝典

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    千方百计笔试题大全

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    网站设计方案(完整版).doc

    SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责 创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的 ,因为一般情况下,一个项目通常只...

    Spring、SpringMVC和Mybatis框架整合包

    另外,MyBatis也可以替换Hibernate,正因为MyBatis的半自动特点,我们程序猿可以完全掌控SQL,这会让有数据库经验的程序猿能开发出高效率的SQL语句,而且XML配置管理起来也非常方便。 好了,如果你也认同我的看法,...

    基于SSH架构的消息管理系统项目

    <br>1、首先修改hibernate.cfg.xml文件,将其中的数据库连接,用户名,密码等修改为正确的数据 2、创建数据库表(启动Tomcat可自动创建) 3、插入初始化的用户(运行init_users.sql中的SQL语句可以插入几...

    Spring面试题

    在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象 当ActionServlet接收到一个客户请求时,将执行如下流程. -(1)检索和用户请求匹配的...

Global site tag (gtag.js) - Google Analytics