我看到好多帖子和博客,都说:
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。
然后接下来,又看到很多博客又这么写到:
load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.
那么问题来了:
那个get()到底用不用二级缓存,是跳过二级缓存还是继续查二级缓存?
------解决思路----------------------
get 的顺序就是先去一级缓存,没有再去二级缓存,再没有去数据库
load是先去一级缓存,然后看配置,有没有延迟加载配置,如果有就先创建个代理实例,要用到实例对象时再去二级缓存看看,最后数据库。不过get找不到返回的是null.而load会抛出org.hibernate.ObjectNotFoundException异常