5

ばかげた質問かもしれませんが、EntityManager.merge()が例外をスローした場合、キャッチブロック内のトランザクションをロールバックする必要がありますか?または、例外自体はマージが機能しないことを意味するので、次にコミットを実行すると、例外をスローした以前の変更は適用されませんか?

例:

public void setPerson(Person person) {
EntityManagerFactory emf =   Persistence.createEntityManagerFactory("MyLib");
     EntityManager em = emf.createEntityManager();
     try {            
         if(!em.getTransaction().isActive()){
            em.getTransaction().begin();
         }
         em.merge(person);
         em.getTransaction().commit();
         emf.getCache().evict(Person.class); // clear Person cache
     } catch (Exception ex){
         em.getTransaction().rollback(); // Is this necessary?   
     } finally {
         em.close();
     }
}
4

1 に答える 1

4

答えは、em.merge(person)メソッドの詳細とデータベースドライバーの実装によって異なります。

そのメソッドが1つの更新ステートメントのみを実行する場合、rollbackは不要です。ただし、複数の更新を実行する可能性がある場合は、それほど明確ではありません。

私は個人的にそれをそこに保管します

rollbackが削除され、一部の更新が行われた後にメソッドエラーが発生したが、他の更新が行われなかった場合は、ドライバーの実装に応じて、merge明示的にデータベース接続を閉じるか、トランザクションをコミットcommitまたはロールバックします。のjavadocにrollbackよると、動作は実装によって異なります。したがって、エラーが発生しない場合は、部分的な更新をコミットしてしまう可能性があります。java.sql.Connectionrollback

于 2012-04-18T08:05:03.753 に答える