让JPA了解数据库更改

时间:2011-01-11 10:29:22

标签: hibernate jpa jpql

我有两个实体,交易和输入。交易有一些自己的数据和一个或多个条目的列表,其中包括借方和贷方金额。在应用程序的一部分中,我需要删除几乎所有这些,并发现JPQL在这种情况下是最简单和最快的。

我执行此代码:

entityManager.createQuery(
                "DELETE FROM Entry e WHERE e IN (:entries)").
                setParameter("entries", new ArrayList<Entry>(
                entriesToRemove)).executeUpdate();
entityManager.createQuery(
                "DELETE FROM Transaction e WHERE e IN (:transactions)").
                setParameter("transactions", new ArrayList<Transaction>(
                transactions)).executeUpdate();

问题出现在代码中,仍然在同一个事务中(这次执行事务)我需要遍历某些事务中存在的所有条目,EntityManager仍然给我刚刚删除的事务。

我怀疑应该有办法处理这个事件,在我的例子中,我只执行两个删除JPQL但我也可以调用外部服务或其他影响数据库的外部服务。在任何情况下,我都需要确保EntityManager的缓存仍然有效,因为它现在仍然包含已删除的对象。

我尝试过使用entityManager.flush();在这些删除后没有成功。因为我使用executeUpdate();删除被立即刷新到底层数据库,所以我真的不希望它有所帮助。

欣赏任何指针,提示和答案。

3 个答案:

答案 0 :(得分:0)

您可以使用EntityManager界面

中的clear()方法清除整个缓存

或者,如果您知道所有交易都属于某个帐户,则可以在EntityManager Account对象{{1}}中调用refresh(Object entity)

答案 1 :(得分:0)

  

问题出现在代码中,   还在同一笔交易中   (这次执行交易)我   需要遍历所有条目   存在于某些交易中,   EntityManager仍然给了我   我最近的交易   除去。

冲洗模式

  • AUTO是默认行为。您在事务中所做的任何更新都会刷新,以便您的查询能够获取这些更改。

  • COMMIT表示仅在事务提交时刷新更改,而不是在任何查询之前刷新。

如果您使用FlushModeType.COMMIT,可能会出现问题,因为更改仅反映在事务提交上。您正在同一事务中执行两个查询。使用FlushModeType.AUTO它应该可以正常工作它的默认值,所以不需要明确提及它。

如果仍然存在问题,那么您可以在第一次查询后尝试提交事务。

答案 2 :(得分:0)

首先,您确定批量删除声明是否必要?也就是说,如果你没有它,你会遇到一些不良的性能阈值。如果您不需要,则可以使用session.delete(e)

否则,如果您正在使用休眠,正如问题中的标记所示,您可以使用session.evict(e)手动从会话中删除实体。您可以使用建议的代码here进入休眠会话。

希望有所帮助。