1

以下のコードを使用して、レコードをデータベースに挿入しています。

    EntityManagerFactory emf = getEmf();
    em = emf.createEntityManager();
    //Get the Transaction
    EntityTransaction trx = em.getTransaction();
    trx.begin();
    for ( int i=0;i<10000;i++) {
       //Create new Object and persist
        Customer customer = new Customer(.....);
        em.persist(customer);
        //Once its reach the 1000 size do commit
        if ( i % 1000 == 0 ) { 
            em.flush();
            em.clear();
            trx.commit();
        }
    }
    em.close();

新しい Customer オブジェクトのように、データベースに重複する値がない場合、上記のコードは正常に機能しています。データベースに Customer の値が重複している場合、「SQLIntegrityConstraintViolationException」が発生します。

ここでは、persist () を使用して、パフォーマンスの問題のためにレコードをデータベースに挿入しています。マージ()を使用すると、正常に機能します。しかし、タスクを完了するにはもっと時間が必要です。

persist() の場合、どれが重複レコードであるかを特定する (つまり、重複レコード情報を取得する) オプションはありますか?

DB に複数の重複レコードが存在する場合、どれが重複レコードであるかを特定するオプションはありますか?

4

1 に答える 1

0

重複を追加しないようにすることは、アプリケーション コードの責任であると考えています。

persist() に送信した顧客のリストを保存し、コミットする前に、次のような JPQL クエリを使用してデータベースにクエリを実行できます。

SELECT COUNT(c)
FROM Customer c
WHERE c in (:customers)

リストを customers バインド変数に送信します。結果を確認し、カウントが 0 より大きい場合は、顧客が重複しており、コミット時に SQLIntegrityConstraintViolationException が発生することがわかります。

em.find(customer, Customer.class)または、 persistence 呼び出しで em を Persistence Context に追加する前に、への呼び出しを使用します。存在する場合は、追加しないでください。

于 2012-09-07T13:35:28.107 に答える