1

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

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

4

2 回答 2

3

级别 - 1 :此缓存的范围是EntityManagerPersistenceContext(不用于 Hibernate,但可能是会话)。

Level - 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 不使用主对象的缓存。Hibernate 将尝试为任何关联的对象使用缓存。然而 Session.find 确实会导致缓存被填充。Query.find 的工作方式完全相同。在获得缓存命中的机会较低的情况下使用这些。

于 2012-05-08T12:00:35.190 回答
1

更新后尝试使用 em1.flush() :)

于 2012-05-08T09:48:45.703 回答