Как удалить несколько объектов в пакетном вызове, используя их идентификаторы? - PullRequest
3 голосов
/ 19 декабря 2011

Как я могу удалить несколько объектов в пакетном вызове, используя их идентификаторы?

Я пробовал это

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 делает это, чтобы присоединить объект к контексту.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2011

После нескольких экспериментов я закончил хакерским 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.

2 голосов
/ 19 декабря 2011

Попробуйте использовать JPQL

em.createQuery("delete from  Visitor v where v.id in (:param)")
.setParameter("param", idsList).executeUpdate();

Документы OpenJPA: http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manual/jpa_langref.html#jpa_langref_bulk_ops

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...