- 浏览: 924668 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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与回车符
LoadEventListener中的LoadType
接着上一篇,我们来看方法fireLoad(event, LoadEventListener.GET);
第一个参数就是前面已经准备好的LoadEvent对象,我们重点看下第二个参数.
这个fireLoad的签名是这样的:
fireLoad(LoadEvent event, LoadType loadType)
追着看下LoadType的定义,有点吓一跳,这个类是在接口LoadEventListener中定义的一个static final类型的Class,这还真是第一次见,以前见过在普通类中定义或static或非static内部类的,一真没见过这样在接口中定义的.写动这里,有一个疑问在接口中可不可以定义一个非static也非final的类呢?当在Eclipse里写了如下的定义并保存时,Eclipse没有报错.
public interface MyInterface {
public class MyInnerClass{
}
}
Eclipse没有报错,说明这样的定义是可以的.但又禁不住多想了一下:在接口中声明属性时,编译器都会自动地给加上"public static final"来修饰的,那我在定义MyInnerClass时即使没有显式地写上"static final",编译器在编译时也会不会自动回呢? ------------- 这个问题先放这,毕竟与Hibernate有些远了,等看了相关的说明再做解释.
言归正转.
先围绕着这个LoadType里的属性往前多想一下.LoadType里有如下五个属性:
String类型的name,其余四个都是boolean类型的,依次是nakeEntityReturned,allowNulls,checkDeleted,allowProxyCreation.这四个boolean型的属性会在以后有什么用呢?nakeEntityReturned是否与allowProxyCreation有点重复?总觉得在Hibernate里只要不允许创建Proxy就是nake的了.还有这个allowNulls,这里的null是指什么?是指要load里来的对象属性是否为空(也就是是否延时加载)?还是指这个要加载的对象是否可为Proxy?这样一来又与那两allowProxyCreation的定义有冗余了.这个checkDeleted是check什么的deleted与否?这些问题的进一步澄清还得依赖以后对Hibernate更多的了解与具体应用中的细心体会,不过现在这样一想,最起码的好处是记住了LoadType里有这么四个boolean的属性.
LoadEventListener里定义了这个LoadType类后又在LoadEventListener接口中定义了几个LoadType的常量(当然是public static final的了),依次是RELOAD,GET,LOAD,IMMEDIATE_LOAD,INTERNAL_LOAD_EAGER,INTERNAL_LOAD_LAZY和INTERNAL_LOAD_NULLABLE.
值得注意的是如下两点:
1,这里的RELOAD和GET,它们的name都是"GET",所不同的另外的四个属性不同,那为什么要起相同的name呢?这里面又有什么玄机?
2,比较LOAD和GET,发现它们的allowProxyCreation属性相反:GET里为false,LOAD里为true,是否这就是为什么Session里get方法返回是实打实地从数据库里取出的数据而load只是返回一个proxy对象的根源所在?这个问题先放在这等对get和load方法比较的差不多时再回过头解释.
对LoadEventListener下的LoadType花了点时间后,下面进入fireLoad方法本身.
前两句调用errorIfClosed();checkTransactionSynchStatus();第一个方法可能抛出SessionException异常,即throw new SessionException( "Session is closed!" );这个异常可是很常见的终于知道是怎么抛出了,呵呵...第二个方法再深追就很长了,现在也不大清楚是干啥的,就先放在这.
接着往下走,从已注册的listeners中getLoadEventListeners,再通过for循环的方式依次调用LoadEventListener的onLoad,这个onLoad方法的形参也就是前面准备好的event和loadType了.
接下来进入LoadEventListener接口的实现类DefaultLoadEventListener执行onLoad方法,这样get方法就将进入实质性的执行阶段.
DefaultLoadEventListener中的onLoad方法的实现很长,有五十多行,只能在下一篇里详细研究了,本篇里先简单看下DefaultLoadEventListener这个类.
很好奇这个类里先定义了两个static final修饰的Object类型对象,分别命名为REMOVED_ENTITY_MARKER和INCONSISTENT_RTN_CLASS_MARKER.以前可是没见过直接new一个Object类型对象的,在Hibernate这可真是开眼了.这两个Object对象有什么用?又怎么用呢?毕竟Object里实在没有什么可以拿的出手的方法.
在DefaultLoadEventListener里搜了下后发现return语句后用到了这两个对象,那这样也就是说用Object对象来指向get到的数据了?那怎么能放到Object对象里面呢?Object本身又没有什么专门的方法,再说这两个Object对象已定义为final也就不会再利用"父类变量来指向子类实例"这一特性了. 再细看DefaultLoadEventListener类里对这两个方法的应用,也就是如下的语句:
if ( entity == REMOVED_ENTITY_MARKER ) {
log.debug( "load request found matching entity in context, but it is scheduled for removal; returning null" );
return null;
}
这两Object的作用还真是与它的名字所言,就是作为Marker来用的.那为什么不像平常所见的所样定义个int类型的常量呢?噢,若这样的话与那个entity就没法比较了,不对呀,Java里不是对那些基本类型都有了封装类了吗?那基本类型的封装是在1.5中才有的,为了兼容在Hibernate里没用这个新特性?这样的解释能说的通吗? --- 这个离Hibernate远一点的问题就先放在这,以后再回过头来看吧.
DefaultLoadEventListener类中还有一个属性:LockMode DEFAULT_LOCK_MODE = LockMode.NONE;这个是要干啥用的?搜了下本类中没有用到,再说那个LoadEvent里已有这个属性了,是要与LoadEvent里的那个属性比较?比较的话也不至于再在这声明一个DEFAULT_LOCK_MODE引用,NONE本身是一个static final修饰的,直接要来用就OK了, ... 不对,这里有点东西,NONE是一个static final的没错,不过在这LockMode.NONE这么一声明就相当于又new了一个LockMode对象,可放在这又有什么用呢? --- 先放一放.
DefaultLoadEventListener类中除了onLoad这个接口实现方法外还有十个或private或protected的方法,都是直接或间接地被onLoad调用的,在下一篇中结合onLoad方法再细细研究.
评论
1, 他们都是一个Object类的实例,从其封装的属性来看,没有任何区分, 这样就只能通过它们在内存中的地址来区分了. 结合当前类里的loadFromSessionCache方法看,明白了.
2, 但为什么不用字符串呢? 用字符串比较时要比直接比较内存地址慢? 可能是这个原因吧.
发表评论
-
Spring下配置job
2010-07-20 15:58 3398没什么可说的, 今天把以前配置的一个job重新整理了下,用ma ... -
研究下Spring中AOP的实现?
2010-06-03 17:57 1321碰到一个AOP的问题, 见“用Spring的 ... -
Debug地研究Hibernate分页功能过程中的另外收获
2009-12-17 15:04 13191, 如用MySQL,其分页sql是啥样的: selec ... -
CJC(二): abstract、子类与多态的单例模式
2009-03-16 10:33 2250CJC是Common Java Cookbo ... -
CJC(一): ToStringBuilder两种方法用法优缺点及一个问题
2009-03-15 20:37 4030CJC是Common Java Cookbook的缩 ... -
研究源码的新天地: 避害趋利
2009-03-14 14:48 1636前两篇分别描述了"为什么要研究源码" ... -
Acegi(十三): 让系统记住我
2009-03-13 09:59 2477经过一段时间的总结, 对Acegi的初步研究终于到 ... -
研究源码的新天地: 研究源码的痛苦
2009-03-12 15:50 1757上篇 中,写了出于什 ... -
研究源码的新天地: 为什么研究源码?
2009-03-11 21:03 1900把前些列出的一个 ... -
Acegi(十二): anonymousProcessingFilter有什么好玩的?
2009-03-09 17:47 2431在这篇博客中, 我们接着看另一个Filter, ano ... -
Acegi(十一): 借鉴Acegi的Exception的异常处理
2009-03-05 11:16 1493今天改项目中的一个问题时, 不由自住地想到了Acegi异 ... -
Acegi(十): securityContextHolderAwareRequestFilter结
2009-03-04 21:46 1842在Acegi(八) 和Acegi ... -
Acegi(九): 子类SavedRequestAwareWrapper
2009-03-02 22:27 2222上篇 中我们对 securi ... -
Acegi(八): securityContextHolderAwareRequestFilter
2009-03-01 22:03 2404上篇 中我们说了下 LogoutFilter的配置, 这篇 ... -
Acegi(七): LogoutFilter配置及几个问题
2009-02-28 18:49 2836这些天有点懒散, 想 ... -
Acegi源码研究(六): Acegi编码/设计碎得
2009-02-18 22:28 1620前些天通过一个Acegi的Web实例,我们感受了下 ... -
Acegi源码研究(五):七剑下天山
2009-02-17 23:10 2008在Acegi初体验及初解剖(http://rmn19 ... -
CoreJava: 第一次用LinkedHashSet带来的思考(二)
2009-02-15 21:05 1543在第一次用LinkedHa ... -
CoreJava: 第一次用LinkedHashSet带来的思考(一)
2009-02-14 19:34 8278用Java虽说时间不 ... -
Acegi(四):Acegi初体验及初解剖
2009-02-14 12:03 3298上篇博客中,我们以静态地角度对Acegi的核心概念及其 ...
相关推荐
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
在Hibernate源码中,`get`方法直接调用了`sessionFactory`的`load`方法,但是传递了一个额外的参数`LockMode.NONE`,这表明它不希望获取任何锁定。而`load`方法允许设置不同的锁模式,以支持并发控制。 在实际开发...
`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...
5. **Session接口**:是Hibernate的核心接口,负责对象的持久化操作,如保存(save())、更新(update())、删除(delete())以及查询(load(), get())等。 6. **Transaction管理**:Hibernate支持JTA(Java ...
Hibernate 是一个著名的开源Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的交互。在本文中,我们将深入探讨Hibernate 3.6.1版本的源码,了解其内部工作原理以及关键组件的功能。 源码分析...
2. **持久化模型**:源码中可以看到,Hibernate通过注解或XML配置文件来定义Java类为持久化实体,实现了对象与数据库表之间的映射。 3. **缓存机制**:Hibernate支持二级缓存,源码中可以深入理解其工作流程,包括...
**hibernate入门学习笔记+源码** **一、Hibernate简介** Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过提供对象化的数据访问方式,Hibernate消除了传统JDBC代码中的...
在深入探讨Hibernate源码之前,我们首先需要理解什么是对象持久化技术。对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)中,以便在后续的程序运行中可以恢复这些对象的状态。它解决了应用程序中的...
4. 加载(Load/Get):根据主键从数据库中获取对象,返回持久化状态的对象。 六、查询语言 1. HQL:Hibernate查询语言,类似SQL但面向对象,可以方便地进行对象间的关联查询。 2. Criteria API:提供更灵活的查询...
《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...
【hibernate_first_new项目源码】是一个关于Hibernate框架学习的项目,主要涵盖了对Hibernate常用接口的详细讲解和实例应用。Hibernate是一个强大的Java持久层框架,它为开发者提供了对象关系映射(ORM)功能,使得...
在Hibernate源码的学习过程中,我们可以深入理解ORM的工作原理,提高我们的Java开发技能,并且能够更好地优化数据库操作。 一、Hibernate核心组件 1. Configuration:配置对象,负责读取hibernate.cfg.xml文件,...
2. **Hibernate_02**: 在这个阶段,开发者可能学习了如何在Hibernate中使用Session接口进行数据操作,比如保存(save()或persist())、更新(update())、删除(delete())和加载(get()或load())对象。此外,还...
传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...
《Hibernate电子版及源码》资源集合是一份珍贵的学习材料,专为那些渴望深入了解Java持久化框架Hibernate的开发者准备。Hibernate作为一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作...
这份资料包含的中文说明将帮助开发者更好地理解和使用Hibernate3.2,而源码则提供了深入学习和研究的宝贵资源。 1. Hibernate ORM概述: Hibernate是一种将Java对象与关系数据库进行映射的技术,它通过提供一种...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转换为对象级别的操作,从而简化了数据访问层的开发。在 Hibernate 3.2 版本中,这个框架已经相当成熟,提供了丰富的功能和性能优化。...
2. **实体类和映射文件**:在Hibernate中,我们创建Java类来表示数据库中的表,通过Hibernate的XML映射文件(或注解)定义这些类与数据库表的对应关系。 3. **SessionFactory和Session**:SessionFactory是...
Java Hibernate 是一个强大的持久化框架,它简化了Java应用程序与关系数据库之间的交互。这个"java hibernate 上课源码6"应该包含了一系列示例代码,用于教授如何在实际项目中应用Hibernate。通过深入理解这些源码,...