我有两个实体,交易和输入。交易有一些自己的数据和一个或多个条目的列表,其中包括借方和贷方金额。在应用程序的一部分中,我需要删除几乎所有这些,并发现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();删除被立即刷新到底层数据库,所以我真的不希望它有所帮助。
欣赏任何指针,提示和答案。
答案 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进入休眠会话。
希望有所帮助。