日期:2014-05-19  浏览次数:20578 次

Hibernate一级缓存session的原理和内部结构
感觉hibernate是越学越难,像了解一下session的内部结构是什么样的,哪位高手能指教一下:

比如get和load时,session是怎么来保存真实对象和代理对象?
update时是先从数据库中加载一条数据,然后在和要更新的对象比较,若不同,则发送update语句吗?
通过load加载上来的数据,delete时会发送select语句,但好像不会填充session中缓存,为什么?
session是通过什么来判断缓存中已经有了某个对象,对象的id?


------解决方案--------------------
一般情况下,get会直接查询数据库,返回你需要的对象,当没找到对象时,返回null。
load会返回一个代理对象,当你真正用到它的时候,才查询数据库。所以当没找到对象时,抛异常。
你看到的delete时发送select,是因为load的延时性。
update方法不会发送select。你一定是用了merge方法。
update就直接用你传的pojo去update,这个pojo变为持久化对象,纳入Session的缓存管理范围。
merge才会发送select,得到一个具有相同持久化标示符的对象,纳入Session的缓存管理范围,然后把你传的pojo中的属性set进去,最后返回那个缓存中的持久态对象。
这导致update和merge有个很大的区别就是,update过的pojo,将变成持久态对象,而如果此时Session中已有相同id的持久态对象的话,update将抛异常,因为Session里,持有相同持久化标示符的对象,只能有一个。而merge过的pojo,还是个脱管态对象。如果此时Session中已有相同id的持久态对象的话,merge将不发送select语句,而直接拿这个对象来用,返回值也是它。