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
?
?