JPA EntityManager 返回没有 entityManager.clear 的陈旧值

Posted

技术标签:

【中文标题】JPA EntityManager 返回没有 entityManager.clear 的陈旧值【英文标题】:JPA EntityManager returns stale values without entityManager.clear 【发布时间】:2012-07-19 10:10:40 【问题描述】:

我在 Spring/Hibernate 中使用 JPA EntityManager,当我从休眠会话更新实体然后从不同的休眠会话查看它时,entitymanager 似乎表现得很奇怪。

我的应用程序中有以下配置:

    EHCache,并启用二级缓存 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 在实体上 在em 上扩展PersistenceContext OpenEntityManagerInViewFilter

致电em.clear() 可解决此问题。我尝试禁用二级缓存、查询缓存等,但没有帮助。我希望 entitymanager 会处理这个问题。这是预期的吗?我正在寻找一种更清洁的方法,并取消调用em.clear()

【问题讨论】:

【参考方案1】:

这些陈旧的实体由扩展的持久性上下文管理,独立于事务。在 JPA 2.0 规范中,它的拼写如下:

请注意,当一个新事务开始时, 扩展的持久性上下文不会从数据库中重新加载。

没有任何内置功能可以自动刷新它们。您可以做的是对单个实体使用 clear 或 EntityManager.refresh,并且可能在映射中使用级联 REFRESH 操作。

【讨论】:

会不会是与 URL 相关的东西?我注意到当我更新实体时,url 是 save.html 并且当我获取它的 time/list.json 时 - 这会变得陈旧。但是,当我尝试使用 time/list.html 获取时,它工作正常!即使两个网址都映射为使用相同的服务......我现在很困惑。这个扩展的持久性上下文是否进行基于 url 的缓存? Hibernate 对您的 Web 应用程序的 URL 一无所知,因为它设计为在 JavaSE 和 JavaEE 环境中工作,不依赖于 javax.servlet API(或与 Web 层相关的任何 API)。您的问题必须与使用两个不同会话的事实有关。 当然,我应该知道的。正如我所说,我很困惑。【参考方案2】:

我找到了问题的根本原因。这是因为我的更新和获取是从两个不同的 servlet 上下文中完成的。我现在将它们放在相同的上下文中并且效果很好。

【讨论】:

以上是关于JPA EntityManager 返回没有 entityManager.clear 的陈旧值的主要内容,如果未能解决你的问题,请参考以下文章

怎样用JPA的EntityManager执行原生sql返回ResultSet-CSDN论坛

创建没有 persistence.xml 配置文件的 JPA EntityManager

JPA-MSAccess DB 的 EntityManager 没有持久性提供程序

Spring boot + Hibernate + JPA 没有可用的事务性 EntityManager

JPA EntityManager查询--使用原生sql查询

JPA EntityManager查询--使用原生sql查询