IDを使用してバッチコールで複数のオブジェクトを削除するにはどうすればよいですか?

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 文がありますが、それはスローされます

 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)

I have single thread.

Update:

I also tried

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

But it's slow because on every iteration it sends SELECT to a server. I assume OpenJPA does it to reattach object to context.

3
HibernateTemplate deleteAll()がありますが、EntityManagerには同等のものがありません。
追加された 著者 Sridhar-Sarnobat,

2 答え

複数の実験の後、私はhacky JPQLクエリーをやり終えました。コードスニペットは次のとおりです。

List 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でうまく動作します。

3
追加された

JPQLを使用しようとする

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

OpenJPA docs: http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manual/jpa_langref.html#jpa_langref_bulk_ops

1
追加された
残念ながら、Query.executeUpdate()はすぐにDBにクエリを送信します。これは、mysql + openjpaでテストした em.commit()までキューに入れません。
追加された 著者 expert,
問題は、1K行を削除すると速度が遅すぎるということです。私はOpenJPAにDBへの往復呼び出しをしたくありません。
追加された 著者 expert,
em.commit ...?あなたのトランザクション管理は厄介です。あなたのプラットフォームは何ですか?トランザクションマネージャはありませんか?一方、文をDBに送信してもトランザクションはコミットされず、変更をロールバックすることができます。私はここで問題を見ることはできません。
追加された 著者 Piotr Gwiazda,