两个实体管理器实例在第一个实例中进行更新时,第二个实体管理器实例选择旧值

时间:2012-05-08 09:38:48

标签: java hibernate entity

我正在使用hibernate实体管理器3.4.0.GA,我有一个流动的问题: 我有两个实体经理实例 em1 em2 ,我有一个实体。我在 em1 中更新实体,然后在 em2 中选择它,但 em2 对数据库进行选择,但在实体中有旧值(在更新之前)。我做错了什么:(

确切步骤在 em1 (T1)中我获取实体并更新它然后提交T1并且更改在数据库中,然后在 em2 (T2)我做了获取所有实体的jpa查询,但实体(我在T1中成功更新)保存旧值,因为它从第一级缓存中重写:(。

2 个答案:

答案 0 :(得分:3)

级别 - 1:此缓存的范围是EntityManagerPersistenceContext(不习惯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():)