2012-07-19 80 views
0

返回我使用JPA的EntityManager与Spring/Hibernate和EntityManager的似乎是行为古怪,当我更新从Hibernate的Session的实体,然后从不同的休眠会话查看它的过时的值。JPA的EntityManager没有entityManager.clear

我在我的应用程序如下配置:

  1. 的EHCache和启用二级缓存的实体
  2. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
  3. 扩展PersistenceContextem
  4. OpenEntityManagerInViewFilter

调用em.clear()解决了这个问题。我试过禁用二级缓存,查询缓存等,但没有帮助。我希望这位实体管理者能够照顾到这一点。这是预期的吗?我正在寻找一种更清洁的方法,并取消拨打em.clear()

回答

1

这些陈旧的实体通过扩展持久化上下文管理,独立于交易。

注意,当一个新的事务开始,在 扩展持久化上下文的管理对象不从数据库中装载:在JPA 2.0规范这一如下拼写。

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

+0

它可能是与URL有关的东西?我注意到,当我更新实体时,url是save.html,当我获取它的time/list.json时 - 这会导致陈旧。但是,当我尝试使用time/list.html进行提取时,它工作正常!即使这两个网址映射到使用相同的服务...我现在感到困惑。这是否扩展持久性上下文做基于URL的缓存? – Supra 2012-07-19 10:52:02

+0

Hibernate知道也不关心你的Web应用程序的URL,因为它的设计在JavaSE中和JavaEE的环境中工作与'javax.servlet'的API不存在依赖关系(或与Web层有关的任何API)。您的问题必须与使用两个不同会话的事实相关。 – 2012-07-19 12:45:41

+0

当然,我应该知道这一点。正如我所说,我感到困惑。 – Supra 2012-07-19 13:24:15

0

我找到了问题的根源。这是因为我的更新和抓取是从两个不同的servlet环境中完成的。我现在把它们放到相同的上下文中,它工作正常。

相关问题