在博客"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.