- 浏览: 922864 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (322)
- Hibernate研究&源码 (27)
- Server (10)
- Coder碎语 (64)
- EnglishMulling (11)
- About XML (1)
- persistence (12)
- Core Java & OO (23)
- Java EE (6)
- JavaScript/JSON/Ajax/ext... (22)
- 我的读书笔记 (16)
- Source Codes Study (29)
- workFlow/jBPM (22)
- OFBiz: Open For Business (1)
- 项目积累 (21)
- srcStudy_acegi (1)
- Cache/Ehcache... (9)
- Java Test/JUnit.. (7)
- maven/ant (2)
- 设计模式 (1)
- SOA/cxf/ws-security (2)
- Android (4)
- 云计算/Hadoop (2)
- 加密/签名 (1)
- 正则表达式 (1)
- htmlparser (1)
- 操作系统 (5)
- DB (1)
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示:js跳出循环 ...
jQuery中each的break和continue -
heshifk:
刚刚我也遇到同样的问题,然后就在纠结为什么不能直接使用brea ...
jQuery中each的break和continue -
masuweng:
不错写的.
集万千宠爱于一身的SessionImpl:get研究(四): Hibernate源码研究碎得(8) -
muzi131313:
这个老是忘,做一下笔记还是挺好的
jQuery中each的break和continue -
lg068:
data = data.replace("\n&qu ...
项目小经验: eval与回车符
Hibernate中"亲子鉴定"
本篇中,我们来看doLoad方法,按上篇的分析方法,我们将这个方法分为三部分:
step1,loadFromSessionCache()的调用和对返回结果的判断.
step2,loadFromSecondLevelCache()的调用和对返回结果的判断.
step3,若上面两个方法的的返回值都为null的话,最后调用loadFromDatasource并返回此方法的返回值.
首先看step1,先不管loadFromDatasource这个方法的执行细节,值得注意的是并没有把结果的判断放入到loadFromDatasource方法里,而是通过判断返回值是否为REMOVED_ENTITY_MARKER或INCONSISTENT_RTN_CLASS_MARKER而分情况地做出log,虽说这两种情况下的最终返回值都是null.另一个值得注意的是虽然loadFromSessionCache可能返回null,但也并没有直接将其返回.这也算是一种编程规范吧:把方法调用及对返回的判断与方法的执行分开,这也很想对Exception的处理,有时根据需要并没有把一些异常都catch起来,而是将其抛出.
关于这个step1,还有一个很值得关注的,那就是特别注意整个系统中debug的安排,这里就特意为debug的需要而创建了两个Object类型的Marker.别的地方虽说也有将debug信息记录下来,但那都是随手而来的debug,不像这特意地绕个弯儿来照顾debug的需要.
有了对step1的分析,doLoad里的step2和step3就没什么特别了的.
下面看loadFromSessionCache方法的执行情况.
由于这里的目标很单一,也就不用再细分N多步了.
首先看第一句,SessionImplementor session = event.getSession();
值得注意的是虽然这个SessionImplementor在onLoad里就从event里获得了,但为了保持代码的精简并没有将那里取得的SessionImplementor作为参数再传到loadFromSessionCache里,而是在这个方法是重新获得,这也正是利用了"指针"的好处,想要什么时就直接获得它的"指针".
接着往下走,从sesion中getEntityUsingInterceptor,这个方法是第一次见,看对这个方法的注释发现了"calling the Interceptor if necessary"这句话.
还没有往下看以前,就觉得有些奇怪,既然这里已经取得了那个Entity为什么不直接返回呢?还要来个处理?接着往下看就发现了这样处理的高明之处:看这个get的Entity的状态,从而决定是否将其返回还是返回那个REMOVED_ENTITY_MARKER或INCONSISTENT_RTN_CLASS_MARKER, 这样的实质也就是任务注册逐层分解,同时也管理好每一次任务分配时的Message反馈,而不是把任务交给你就不管了,同时还要充分考虑到你执行当前任务时可能出现的Message反馈.
以前对EntityEntry这个类老是不能很好地理解,觉得这个名字本身起的就有些怪怪的,Entity就Entity吧,怎么还再来个Entry呢?现在结合这里的实际应用,终于有了很直观的感觉了.
这里有从oldEntry里getStatus的语句,根据这个大致就可以推断出EntityEntry一个用途,那就是Hibernate利用这个类来获得Entity里与Hibernate相关的信息,这样也就理解了Entry一词在这的作用了.
接下往下看,总觉得这段话有点意思:
if ( options.isAllowNulls() ) {
EntityPersister persister = event.getSession().getFactory().getEntityPersister( event.getEntityClassName() );
if ( ! persister.isInstance( old, event.getSession().getEntityMode() ) ) {
return INCONSISTENT_RTN_CLASS_MARKER;
}
}
先不看那个isAllowNulls的作用,下面的isInstance的判断就些不对劲,感觉夫妻俩生了孩子后不是高兴,而是马上给这个孩子做亲子鉴定!本来嘛,这个Entity就是在与之对应的EntityPersister的一手监管下取得的,而这个Entity"独立"后,竟然对这个Entity做"亲子鉴定",有这个必要吗?
当然,我的这个形象的理解是有问题的,Hibernate经过这么久的考验了,这种"亲子鉴定"真正意义上也没有发生.不过通过这个反映出以前我对EntityPersister的理解还不全,需要进一步的修正.在这里也通过这个形象点的比喻来加强对这个问题重视.
下面是另一个方法upgradeLock了,追着看了下,这个方法是从DefaulLoadEventListener的父类AbstractLockUpgradeEventListener里继承来的.
这个方法很长,只能交给下篇来研究了.
评论
以前想的有些问题, 说这个类描述的信息是数据库里的信息在Hibernate里缓存的id不准确. 在准确在于, 它只是Session缓存的id而不是全部缓存的id.
发表评论
-
createSQLQuery时,addScalar的应用
2010-11-19 16:11 2676问题起因: 抛了异常:n ... -
Hibernate源码研究碎得整理(14-25)
2010-10-24 19:30 27571, Hibernate源码研究碎得(十四): EntityK ... -
Hibernate:Query中list、iterate和uniqueResult三个方法的区别
2010-09-07 16:31 3647想看下org.hibernate.Query接口中定义的三 ... -
Hibernate如何实现分页的?
2009-12-17 14:50 4840解决项目中一问题时, 由于涉及到Hibernate的分 ... -
Hibernate删除一个session.load来的Model类?
2009-11-27 16:44 1568如下所示: public stati ... -
关于Session.getIdentifier(Object entity)的讨论
2009-08-10 17:30 1966在重读Hibernate时,在4.2.2一节发现这么一段话: ... -
Hibernate(25): Eclipse的debug欺骗了我
2009-05-08 09:45 1879Hibernate(24): 为什 ... -
Hibernate(24): 为什么用DetachedCriteria不能表连接地取数据?
2009-05-05 08:39 3339HQL到DetachedCriteria的转换? 中 ... -
Hibernate(23):一个较为复杂些的例子
2009-04-27 08:55 1905觉得该用一个更加丰富的例子来进一步研究Hibernat ... -
Hibernate(22):openSession的执行细节及相对优势
2009-04-23 11:04 2847Hibernate(21):getCurrentSession ... -
Hibernate(21):getCurrentSession还是用openSession?
2009-04-22 09:48 4544从Hibernate(十九): ... -
Hibernate(20):默认情况下决定commit时session命运的三个条件
2009-04-21 10:03 2888Hibernate(十九): 异 ... -
Hibernate(十九): 异常"Session was already closed"
2009-04-20 08:33 9094做一个Hibernate简单实验时, 碰到了这个异 ... -
Hibernate(十八): Hibernate初始化时如何生成SQL语句?
2009-04-13 09:24 5361昨天看Hibernate方面书时又看到了"d ... -
Hibernate(十七): Criteria子查询与ENTITY_MAP时的问题(续一)
2009-04-09 08:39 2367在Hibernate(十六): DetachedCri ... -
Hibernate(十六): DetachedCriteria子查询与ALIAS_TO_ENTITY
2009-04-08 13:01 8835跟Hibernate(十五):用Hibernate求记 ... -
Hibernate(十五):用Hibernate求记录总数的一个怪胎
2009-04-07 21:28 4223项目中求满足某一条件记录数是这样来的: super. ... -
怎么用Hibernate中的Criteria来表达下面的SQL
2009-02-24 16:07 1898这个问题解决 后, 我对Hibernate的查询功能更感兴趣了 ... -
Hibernate源码研究碎得(十四): EntityKey类的作用及研究方法收获
2009-02-22 22:43 2198在博客"http://rmn190.iteye ... -
Hibernate源码研究碎得整理(一到十三)
2009-02-21 16:32 5978前段时间对Acegi的研究,又勾起我当时看Hibern ...
相关推荐
本篇将详细介绍标题为"DmDialect-for-hibernate4.0.zip"的压缩包文件及其包含的两个重要组件:Dm7JdbcDriver17.jar和DmDialect-for-hibernate4.0.jar,以及它们在SpringBoot项目中的作用。 首先,SpringBoot是一个...
达梦数据DmDialect-for-hibernate所有jar包,DmDialect-for-hibernate2.0、DmDialect-for-hibernate2.1、DmDialect-for-hibernate3.0、DmDialect-for-hibernate3.1、DmDialect-for-hibernate3.6、DmDialect-for-...
spring-boot-hibernate5 整合源码
国产达梦数据库hibernate方言包
通过对Spring-ORM-Hibernate4源码的阅读和研究,我们可以更好地理解这两个框架是如何协同工作的,以及如何优化和定制它们以适应特定的项目需求。这个源码库为开发者提供了一手的学习材料,有助于提升我们在企业级...
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
《深入剖析Hibernate ORM框架:基于hibernate-orm-4.3.9源码》 Hibernate,作为Java领域中的一款知名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。本文将...
在整合struts2.3.7-spring3.0.0-hibernate4.0.0时,发现spring3.0不支持hibernate4.0版本,后来自己整合了两套版本,一个是struts2.3.7-spring3.1.0-hibernate4.0.0,将spring升级,一个是struts2.3.7-spring3.0.0-...
本文将针对《hibernate-orm-3.3源码》进行深度解析,帮助读者理解其核心设计理念与实现机制。 一、Hibernate概述 Hibernate 是一款开源的 Java 库,它简化了数据库操作,通过将 Java 对象与数据库表之间的映射关系...
总结,通过深入研究Hibernate 5.2.16.Final源码,结合c3p0和dom4j的使用,Web开发者不仅能提升对Hibernate框架的理解,还能掌握数据库连接管理和XML处理的技巧,从而在实际项目中更好地利用这些工具,提升开发效率和...
xjar-agent-hibernate-v1.0.0.jar下载
《孙卫琴-精通Hibernate-源码-Chapter1》是一份深入探讨Hibernate源码的教程,旨在帮助读者理解并掌握Hibernate这一强大ORM框架的核心机制。Chapter1作为整个系列的开端,通常会涵盖Hibernate的基础概念、架构设计...
"hibernate-release-5.2.10" 是Hibernate的一个发行版本,这通常包含了源码、编译后的库文件、文档以及示例等资源。5.2.10版本是一个稳定版本,提供了一些bug修复和可能的新功能。对于开发者来说,这个版本意味着...
《深入剖析Hibernate 4.1.4.Final源码》 Hibernate,作为一款著名的Java对象关系映射(ORM)框架,极大地简化了Java开发者在数据库操作中的工作。它通过提供对象化的数据访问接口,使得开发者可以更加专注于业务...
- 下载Hibernate源码:首先从官方网站或镜像站点下载Hibernate的源码包,如hibernate-3.6.9。 - 创建Java项目:在Eclipse中新建一个Java工程,命名为hibernate-study或类似名称。 - 导入源码:将解压后的...
Hibernate源码(hibernate-orm-main.zip)Source Code: Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。 它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
hibernate-3.2.0源码和hibernate-3.2.0所有的jar包。
Hibernate-annotations和Hibernate-validator则支持注解驱动的实体定义和数据验证。 2. **Hibernate EhCache集成(hibernate-ehcache)** EhCache是Hibernate的一个二级缓存插件,用于存储和检索数据,以提高性能...