我正在使用hibernate实体管理器3.4.0.GA,我有一个流动的问题: 我有两个实体经理实例 em1 和 em2 ,我有一个实体。我在 em1 中更新实体,然后在 em2 中选择它,但 em2 对数据库进行选择,但在实体中有旧值(在更新之前)。我做错了什么:(
确切步骤在 em1 (T1)中我获取实体并更新它然后提交T1并且更改在数据库中,然后在 em2 (T2)我做了获取所有实体的jpa查询,但实体(我在T1中成功更新)保存旧值,因为它从第一级缓存中重写:(。
答案 0 :(得分:3)
级别 - 1:此缓存的范围是EntityManager
或PersistenceContext
(不习惯Hibernate,但可能是会话)。
等级 - 2:其范围为EntityManagerFactory
&缓存的对象可以由应用程序中的任何实体管理器检索。
当您使用两个不同的实体管理器时,该对象不是从第一级缓存加载,而是从第二级缓存加载。因此从中检索过时的对象。
您可以尝试session.setCacheMode(CacheMode.REFRESH)
。
否则,您可以在查询中设置提示。
@NamedQuery(name="queryWithNoCache",
query="SELECT e FROM Entity e",
hints={@QueryHint(name="org.hibernate.cacheMode", value="REFRESH")})
您也可以尝试其他模式。
Ehcache文档:
Session.find不使用主对象的缓存。过冬 将尝试将缓存用于任何关联的对象。 Session.find 但是会导致缓存被填充。 Query.find适用于 完全一样的方式。在有可能获得缓存的地方使用这些 命中率很低。
答案 1 :(得分:1)
尝试在更新后使用em1.flush():)