2008-05-23

EntityEntry, EntityKey, Cache..Hibernate源码研究碎得(13)

关键字: entityentry, entitykey, cache...
如上篇结束时所言,本篇中着重研究upgradeLock这个方法.   进入方法后第一句就是这个requestedLockMode.greaterThan( entry.getLockMode())判断,若不成立,就马上退出此方法.   有些疑问的是EntityEntry类型的entry里getLockMode有什么意义?再往下追就是EntityEntry里的lockMode是什么时候什么情景下赋值的? ....................... 刚才用Eclipse里实际debug了一番,现在明白了些.  1,那个LockMode所Lock的是缓 ...
Hibernate中"亲子鉴定" 本篇中,我们来看doLoad方法,按上篇的分析方法,我们将这个方法分为三部分: step1,loadFromSessionCache()的调用和对返回结果的判断. step2,loadFromSecondLevelCache()的调用和对返回结果的判断. step3,若上面两个方法的的返回值都为null的话,最后调用loadFromDatasource并返回此方法的返回值. 首先看step1,先不管loadFromDatasource这个方法的执行细节,值得注意的是并没有把结果的判断放入到loadFromDatasource方 ...
在这篇中本来是没想着画EntityPersister接口继承关系及其实现类的类图,可看着看着觉得这个继承关系很壮美,也就很想看到它的全貌,于是就有在这另一篇博客里的类图. 言归正传,来看DefaultLoadEventListener类里的load方法,这个方法里可分为如下三步: step1,判断并处理instanceToLoad不为null时的情况. step2,做实质的doLoad方法,返回Object类型的对象. step3,判断step2里返回的结果,若不符合就抛出相应的异常,从而结束这一超长的get/load操作. 先看step1,这里有个event ...
2008-05-20

满城尽是Interface,接口真的那么神奇?--Hibernate源码研究碎得(10)

关键字: 满城尽是interface, 接口真的那么神奇?
满城尽是Interface,接口真的那么神奇? 晚饭后由于不能很集中地思考,就大致地看了EntityPersister这个接口的继承关系及其实现类. 呵,真是不看不知道,一看吓一跳,又是一个很庞大的继承树,而且还里有那么多的接口,不禁就感叹了:为什么Hibernate里这么多的接口?这样的接口设计能达到想像的效果么?在解藕合方面真能那么灵验?感觉有些接口过度了,不丁点的小事动不动就来一个接口.说句"大言不惭"的话,在自已的设计中是绝对想不到用这么多接口的. 写着写着,就意识到了:用众多接口而不用众多类是一个以前没想到(或没有这么强烈感觉到)的好处的,那就是利用接口可以视具体情况而做到细粒 ...
上一篇花了很长时间梳理了下SessionImplementor接口与Hibernate里其它关键类和接口的关系并画出类图,最后得出"集万千宠爱于一身的SessionImpl"标题.本篇将接着往下走,下面先看第二句 EntityPersister persister; 声明了一个变量persister.(写到这有两种选择,一是像对SessionImplementor一样对这个EntityPersister接口好好研究一番,这样的话研究的很细,不过一个突出的问题就是由get方法牵连出很多点,分散精力;另一选择是把这个EntityPersister放在当前DefaultLoadEventListe ...
上一篇重点介绍了LoadEventListener里的LoadType这个static final类及其在LoadEventListener里的定义的几个对象后,简单 地介绍了DefaultLoadEventListener里的三个static final属性,现在在这篇中将重点研究这里的onLoad方法. 进入onLoad方法后,第一句就是从event中getSession,这个返回值以SessionImplementor类型的变量保存住,如下所示:  final SessionImplementor source = event.getSession();& ...
LoadEventListener中的LoadType 接着上一篇,我们来看方法fireLoad(event, LoadEventListener.GET);第一个参数就是前面已经准备好的LoadEvent对象,我们重点看下第二个参数.这个fireLoad的签名是这样的: fireLoad(LoadEvent event, LoadType loadType) 追着看下LoadType的定义,有点吓一跳,这个类是在接口LoadEventListener中定义的一个static final类型的Class,这还真是第一次见,以前见过在普通类中定义或static或非static内部类 ...
从源码层面来看load与get的区别(二): Hibernate源码研究碎得(5) 接着上一篇问题的引入,本篇中我们先从Session里我们很熟悉的get(Class entityClass, Serializable id)起步.小菜这用的例子是Hibernate里自带那个, 程序的入口为下面的Java语句: person = (Person) session.get(Person.class, 1L);  在DB中已事先插入下面一条记录: PERSON_id age firstname  lastname  ...
  • 09:06
  • 浏览 (248)
  • 评论 (0)
2008-05-14

从源码层面来看load与get的区别(一): Hibernate源码研究碎得(5)

关键字: 从源码层面来看load与get的区别(一):
在写以前先跟着源码的执行大致地看了看这两个方法所涉及的东西,一下子感觉到对这两个方法的比较将对以后session里的众多方法乃至整个Hibernate的研究都会起到很大的促进作用,由于这两个方法所涉及的东西很多,估计能写出10篇左右的Blog,我也就不用担心这些天写Blog没什么要出手的了. ************************************************** 源码级地来看load与get的区别(一): load and get: 引用<Java Persistence with Hibernate>中的描述,我们得知load与get方法有如 ...
2008-05-14

Hibernate源码研究碎得(4)

关键字: hibernate源码研究碎得(4)
1, 为什么在new一个Configuration对象时要调用另一个构造方法呢?而另一个构造方法里接收一个传来的SettingsFactory的参数,难倒说在new一个Configuration时还可以另行指定自造的SettingsFactory?这就像Configuration类里的configure()方法那样?调用无参的configure()方法时就去找那个默认的配置文件,但也是另行指定配置文件的位置的.写到这里想起来了,protected这个限定词所描述的也可以在所在包的其它类里调用从而也就生成了这个可配置SettingsFacotry的Configuration对象.再实际地找着验证 ...
2008-05-12

谢谢Hibernate---Hibernate源码研究碎得(3)

关键字: 谢谢hibernate---hibernate源码研究碎得(3)
谢谢Hibernate. 鼓捣Hiberante的源码有一段日子也,回过头来看看这段路,不由地想起"感触颇多"这个词了:从刚开始的"为伊消的人憔悴"到现在的渐入佳境,再往前看尽管还有很长的路要走,不过现在很想说"谢谢Hibernate!" 看了Hiberate源码,我不再浮躁.在Java的学习/应用路上,是有了点点收获,有了这些收获后,也不知道怎么回事,心就静不下来,这个了觉得容易,那个也觉得简单,可要真真动手去做时却发现自己的product漏洞百出!于是恶性循环地怀疑一切,信心没有,学习/生活中情绪也是一踏糊涂. 还好在情绪一踏糊涂时,对Hibernate源码的鼓捣没有停下来,new ...
1, 为什么tables用的是TreeMap这个类呢?而别的大都用的是HashMap2, Environment.getProperties()每次调用都是新建一个Properties对象,把这个对象传对调用者.这样做用什么特殊的好处呢?3, 怪,怎么会出现一模一样的两行LogInfo呢? [2008-05-05 09:16:36,750] INFO  org.hibernate.cfg.Environment Hibernate 3.2.6  [2008-05-05 09:16:36,750] INFO  org.hibernate.cfg.Envir ...