Как я могу удалить несколько объектов в пакетном вызове, используя их идентификаторы?
Я пробовал это
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 делает это, чтобы присоединить объект к контексту.