我正在使用休眠实体管理器 3.4.0.GA,我遇到了流动问题:我有两个实体管理器实例em1和em2,我有一个实体。我更新em1中的实体,然后在em2中选择它,但是em2对数据库进行选择,但在实体中有旧值(更新之前)。我做错了什么:(
确切的步骤在em1 (T1) 我获取实体并更新它然后提交 T1 并且更改在数据库中,然后在em2 (T2) 我进行 jpa 查询以获取所有实体,但实体(我更新成功在 T1) 中保存旧值,因为它是从一级缓存中读取的:(。
级别 - 1 :此缓存的范围是EntityManager
或PersistenceContext
(不用于 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 的工作方式完全相同。在获得缓存命中的机会较低的情况下使用这些。
更新后尝试使用 em1.flush() :)