gpt4 book ai didi

jpa - 如何使用 ID 删除批量调用中的多个对象?

转载 作者:行者123 更新时间:2023-12-04 23:26:36 24 4
gpt4 key购买 nike

如何使用 ID 在批量调用中删除多个对象?

我试过了

EntityManager em = ...
em.getTransaction().begin();
try
{
for (Visitor obj : map.keySet())
{
Visitor fake = em.getReference(Visitor.class, obj.getId());
em.remove(fake);
}

em.getTransaction().commit();
}
catch (Exception ex)
{
ex.printStackTrace();
}

我在日志文件中看到 DELETE 语句,但它抛出了它们

<openjpa-2.1.1-r422266:1148538 fatal store error> org.apache.openjpa.persistence.RollbackException: Optimistic locking errors were detected when flushing to the data store.  The following objects may have been concurrently modified in another transaction: [com.reporting.data.Visitor-53043]
at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:593)
at com.reporting.ui.DBUtil.saveAnswers(DBUtil.java:311)

我有单线程。

更新:

我也试过

for (Visitor obj : map.keySet())
em.remove(obj);

但它很慢,因为在每次迭代时它都会将 SELECT 发送到服务器。我假设 OpenJPA 这样做是为了将对象重新附加到上下文。

最佳答案

经过多次实验后,我最终做出了骇人听闻的 JPQL 查询。这是代码片段:

List<Long> lstExistingVisitors = ...
Query qDeleteVisitors = em.createQuery("delete from Visitor obj where obj.id in (?1)");
qDeleteVisitors.setParameter(1, lstExistingVisitors);
qDeleteVisitors.executeUpdate();

我尝试列出多达 5000 个 ID。它适用于 mysql 5.1 和 H2DB。

关于jpa - 如何使用 ID 删除批量调用中的多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com