我有一个使用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
答案 0 :(得分:1)
说实话,我对JPA并不熟悉,但我遇到了与Hiberate会话管理员类似的问题。我的修复是从Hibernate的会话中手动删除指定的对象,然后再次查询它,因此它被迫从数据库进行查找而不从缓存中获取对象。您可以尝试使用JPA的EntityManager执行相同的操作。
答案 1 :(得分:0)
我刚遇到同样的问题并发现了两件事: