1

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

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

  1. EHCache,并启用二级缓存
  2. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)在实体上
  3. 延长PersistenceContext_em
  4. OpenEntityManagerInViewFilter

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

4

2 回答 2

2

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

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

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

于 2012-07-19T10:36:07.533 回答
0

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

于 2012-07-19T17:04:59.297 回答