Hibernate3.2.6 Session加载数据时get跟load方法的区别
Hibernate3.2.6 Session加载数据时get和load方法的区别
查找顺序:
get和load方法的查找顺序完全相同,不管类的属性配置中:lazy="true"或者lazy="false"
- 首先在session缓存中查找:loadFromSessionCache()
- 然后在二级缓存SessionFactory中查找:loadFromSecondLevelCache()
- 最后从数据库查找:loadFromDatasource()
返回结果:
- 相同 :get和load方法如果在一级和二级缓存中找到持久化对象,直接返回该持久化对象,不会对该对象进行任何包装。(返回的对象:可能是原生的对象,也可能是代理的对象,取决于缓存中对象本身是什么对象)
- 不同 :如果在一级和二级缓存中找不到相应的对象: get查询数据库,找到:返回原生的持久化对象,找不到:返回null.
- load查询数据库: 如果lazy="true", 或者没有配置lazy属性(默认为true) 且 未指定锁(默认LockMode.NONE) 找到: 返回代理的持久化对象 找不到:返回代理的空数据对象,不能对该对象进行获取数据的操作,否则抛出 ObjectNotFoundException
- 如果lazy="false"或者 指定锁(LockMode.READ ...) 找到:返回原生的持久化对象 找不到:抛出 ObjectNotFoundException