第二次查询时,hibernate get()和load()如何工作?请纠正我
get() -> 1) Check 1st Level Cache and 2) DB hit
load() -> 1) Check 1st Level Cache 2) Then 2nd Level Cache Then 3) DB hit
它将如何运作?
假设,我在dabase中使用本机sql或diectly更新(或添加)了记录,get()和load()将如何获得最新的更改?
如果是这种情况,hibernate将自动更新缓存,或者我们需要新的查询来填充缓存(再次查询或session.refresh)?
答案 0 :(得分:1)
不,那不是load()
的工作方式。 load()
检查第一级缓存。如果实体在那里它返回它。否则,它会创建一个包含ID的单元化代理,将其存储在会话中并返回它。代理将在第一次调用方法时初始化。
只要实体状态在缓存中,Hibernate就永远不会从数据库重新加载其状态,除非您要求它刷新或驱逐它。执行查询不会刷新会话高速缓存中的实体状态。这就是会话的生命周期通常非常短的原因:数据库事务的持续时间。