在这篇中本来是没想着画EntityPersister接口继承关系及其实现类的类图,可看着看着觉得这个继承关系很壮美,也就很想看到它的全貌,于是就有在这另一篇博客里的类图.
言归正传,来看DefaultLoadEventListener类里的load方法,这个方法里可分为如下三步:
step1,判断并处理instanceToLoad不为null时的情况.
step2,做实质的doLoad方法,返回Object类型的对象.
step3,判断step2里返回的结果,若不符合就抛出相应的异常,从而结束这一超长的get/load操作.
先看step1,这里有个event.getSession().getPersistenceContext().getEntry(event.getInstanceToLoad()) != null判断,(这个Entry是干啥的?)若不为null就抛出"attempted to load into an instance that was already associated with the session: "Message的Exception.对,从这个message也能理解了不为null也就意味着当前PersistenceContext里已有instance.也就是说这个instance与session已关联起来了,那这样先前所假想的那个refresh功能就是错的了.看下面的persister.setIdentifier()方法,我们就可以修正先前的那个关于refresh的假想,或者说是去evolve那个假说:通过设置这个instanceToLoad,我们是想把处于detached状态的对象再次绑定到session里.这不是update的功能么?难道说update在底层就是调用了这个load方法? ----> 以后做进一步的验证.
看step2的doLoad方法,这又是一个独立的方法.只能留到下一篇来详细研究了,不妨也学Hibernate里proxy概念那样,这个load方法将返回一个Object对象,也就是我们想get/load的那个对象.
下面是step3.
怎么若instanceToLoad不为null就是isOptionalInstance呢?也是说若设置了那个instanceToLoad就说明了这是一种optionalInstance.不理解.
再看下面的判断逻辑,若是optionalInstance或返回结果不能为null的话,就抛出ObjectNotFoundException.这里的"返回结果不为null"可以理解,但optionalInstance...理解了,这个isOptionalInstance也就意味着,事先已设定了那个instanceToLoad,这样即使get/load没有得到更好的结果(hit database),也不能把已有的那个给能丢了吧,估计正是出于这样的考虑,就把这个也加入ObjectNotFoundException异常的管理之内了.
有了刚才的分析,下面的这个判断也就好理解了:isOptionalInstance && entity != event.getInstanceToLoad(),也就是说,我已设置了instanceToLoad,你那边get/load到的东西就得放到这个instanceToLoad里边,不能"狸猫换太子"地给调了包,那岂不是赔大了,辛苦了半天到头来给别人做了一番嫁衣.
至些,经过上面两层的异常筛选,我们就可以返回期盼已久的entity了.
下一篇中将讨论那个真正的功臣:doLoad.
*****************************************************
这篇blog写完了,总有些意犹未尽的感觉,今天写时有些文如泉涌,呵呵,有些自夸了.思路还很清晰.总得想想/总结下原因吧,对Hibernate的研究是很漫长的过程,这个过程中的研究方法也得慢慢完善起来.
现在总结,最先进入mind里的是刚开始画出的那个类图.很直观,扫清了障碍,也更坚定了信心,心里不再疙疙瘩瘩的,可以亮堂堂地前行.这是成功的心理因素.
第二,今天下班后看救灾方面的新闻,看到了一个女子在被埋的几十个小时里把自己小腿用石块砸开,用自己的鲜血维持着生命!在感叹生命力量如此之大之震撼之余,也让我更深刻地理解了生命潜力的巨大.这样常人能以想像的行动,再发观自己呢,生活中工作中的一点麻烦事就感觉天塌了似的,这怎么行?!有了这样坚定的信念,那个类图也就画出来了,今天的分析也很是成功.
第二,分析方法有了很大的改善.就是把load方法先分为三步,而不是像往常那样,不管三七二十一上来就看.这样的化整为零很见效,事实上,大致地看了一眼这个load方法后也有些犯嘀咕.可当分为三步后,目标一下子更明淅了,心情也就更好了,最终有了后面的文如泉涌.
呵呵....