Hibernate源码研究碎得(十四): EntityKey类的作用及研究方法收获

   在博客"http://rmn190.iteye.com/blog/194228"中提出了EntityKey这个类是干啥的问题, 当时也没能想通这个类是做啥的, 只是看了下这个类里某些方法的实现. 今天把回过关再源码及这个类实例的应用场景说一下, 也就可以得出相对正确的结果了.

    这次看EntityKey时没有过多的纠缠到这个类方法的实现上, 更多地看它的JavaDocs里的描述信息(这个关注点的转变是一个提高), 发现有这么条信息" Uniquely identifies of an entity instance in a particular session by identifier, Uniqueing information consists of the entity-name and the identifier value ". 这句话的大概意思是说: 这个类用来表现一个entity instance的ID, 而这个ID是存在Session缓存中的. 有了这个信息, 我们就大致可以判定这个类的用处: 当取一个类在数据库的信息时, Hibernate会用这个类信息对应的 EntityKey去Session缓存中去取;若没取到, 那Hibernate就只能真正到数据库中里取记录了, 取出来后,new一个EntityKey作为Map的key把取回来的信息放到Session缓存中去.

   有了这样的猜想, 我们再看后续的代码,有这样的方法调用 loadFromSessionCache( event, keyToLoad, options ),再追下去,我们看到了Map的get方法, 这个get方法的参数也就是前面传来的keyToLoad.这就验证了上面猜想中从Session缓存中取值的说法.

    再看 loadFromDatasource方法里(很深很深的调用), 有这样的语句: loadFromResultSet(............), 源码中对个方法的注释是这样的" grab its state from the ResultSet and keep it in the Session ", 也就是说从ResultSet里取出想要的Object后再把这个东东以那个EntityKey为key存放到Session缓存中(缓存以Map实现). 这也就验证了上面猜想中取出数据后往Session缓存中放值的说法.


   写到这里还不算完, 若只是停留在这个层次,研究源码也就少了一个收获, 咱们都是学过哲学的, 怎么也得提升到方法论的层面吧: 钓到了一条鱼,我们除了高兴的吃了,再更有意义的是不是总结下钓鱼的经验呢? 这也是一样, 我总结的经验如下:
       1, JavaDocs中对一个类的描述来看类的作用. 以前很少看这些描述信息的, 这次的收获让我对这样的类描述信息有了个很实用很直观的感觉. 这个可以说是静态的看信息.
        2, 从形参的命名来看一个类的作用. 应该说, 一个好的开源项目是很正规的, 这样的方法形参的命名就可以帮助我们看到某一个的作用. 这个就是在现场看运行时信息了.

 

    总结了钓鱼方法后,我们的钓鱼技巧也会更快地提高Di.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值