2012-02-26 19 views
4

J2SEアプリケーションでJPA(OpenJPA)を使用するエントリリストのコンテンツでテーブルを更新しようとしています:新しいエントリを追加するか、既存のエントリを存在するリストに置き換えようとしています。JPA EntityExistsExceptionマージ時に重複するエントリ?

1)これを実行する最善の方法は何ですか?私は数百、同じトランザクション内でマージを実行したいことのために

...(リスト内の項目のいくつかは、同じIDを持つindenticalてもよい)

HSQLDBを使用したとき、正常に動作するよう、しかし、データベースとしてMySQLを使用する場合、私はこの例外を受け取ります: org.apache.openjpa.persistence.EntityExistsException:重複したエントリ

2)何らかの理由はありますか?

コードはシンプルで、このようなものです:

EntityManager em = emfactory.createEntityManager(); 
em.getTransaction().begin(); 

// update messages 
for (Message msg : messages) { 
    Entry e=new Entry(msg.getId(), msg.getText(),msg.getDate()); 
    em.merge(e); 
} 

em.getTransaction().commit(); 
em.close(); 

おかげ

+0

の世代の戦略を持っています。もしそうなら、これを試してトラブルシューティングをして、probの原因となっているmsgを見つけることができます。マージの下のforでコミットを移動します。 try/catchでコミットを囲み、catchのどこかにブレークポイントを設定します。また、Messageエンティティの一意のフィールドは何ですか? – AR3Y35

答えて

0

実体が設定されていない場合、マージはそう...

これは、と私のために働いてい存続くださいH2/HSQL/MySQLのem.contains()の魔法は、現在のトランザクションでエンティティがアタッチされているかどうかを調べます。次の例では

、e.idは、私は、例外がコミット実行形式を来ている推測しているAUTO

if (e.getId() == null || e.getId() == 0) { 
    em.persist(e); 
    if (e.getId() == null || e.getId() == 0) { 
     return null; //Or whatever you want to show that the persist failed 
    } 
} else { 
    if (!em.contains(e)) { 
     return em.merge(e); 
    } 
} 
関連する問題