JPA NamedQuery不会修改已修改的实体

时间:2009-06-02 17:02:39

标签: jpa flush

我有一个使用NamedQuery检索实体的方法。我更新每个实体的值,然后运行另一个命名查询(在同一方法和Transaction中)按旧值过滤,它返回相同的实体,就像我没有更改它们一样。

我知道EntityManager需要刷新,并且它应该自动发生,但这没有任何区别。

我启用了hibernate SQL日志记录,当我调用flush但是当容器事务提交时,可以看到实体更新。

EntityManager entityManager = getPrimaryEntityManager();
MyEntity myEntity = entityManager.find(MyEntityImpl.class, allocationId);
myEntity.setStateId(State.ACTIVE);
// Flush the entity manager to pick up any changes to entity states before we run this query.
entityManager.flush();
Query countQuery = entityManager
        .createNamedQuery("MyEntity.getCountByState");
// we're telling the persistence provider that we want the query to do automatic flushing before this
// particular query is executed.
countQuery.setParameter("stateId", State.CHECKING);
Long count = (Long) countQuery.getSingleResult();
// Count should be zero but isn't. It doesn't see my change above

2 个答案:

答案 0 :(得分:1)

说实话,我对JPA并不熟悉,但我遇到了与Hiberate会话管理员类似的问题。我的修复是从Hibernate的会话中手动删除指定的对象,然后再次查询它,因此它被迫从数据库进行查找而不从缓存中获取对象。您可以尝试使用JPA的EntityManager执行相同的操作。

答案 1 :(得分:0)

我刚遇到同样的问题并发现了两件事:

  • 首先,您应该检查FlushMode的持久性上下文 和/或查询。
  • 其次,确保实体经理是 事务管理和查询完全相同的对象 执行。就我而言,我在实体管理器上有Mockito间谍 足以打破交易管理。