2012-04-18 10 views
5

Belki aptalca bir soru, ancak EntityManager.merge() bir istisna atarsa ​​catch bloğundaki bir işlemde geri alma yapmak gerekli midir? Veya istisnanın kendisi, birleşme bir sonraki seferde, istisna atmış olan önceki değişiklikleri yapmayacağımı taahhüt etmeyecek şekilde çalışacağı anlamına mı geliyor?Yakalama bloğundaki bir işlemde geri alma yapmak gerekli mi?

Örnek:

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(); 
    } 
} 

cevap

4

cevap em.merge(person) yöntemin detayları ve veritabanı sürücüsünün uygulanmasına bağlıdır.

Bu yöntem yalnızca bir güncelleştirme deyimi gerçekleştirirse, rollback gereksizdir. Bununla birlikte, birden çok güncelleme çalıştırabilirse, o zaman o kadar açık değildir.

Ben şahsen rollback kaldırılırsa orada

tutmak ve olur sizin merge yöntem hataları bizim bazı güncelleştirmeler yapılır ama diğerleri, daha sonra açık commit veya rollback taahhüt edecektir ya da geri alma olmadan bir veritabanı bağlantısını kapatma sonra Sürücü uygulamasına bağlı olarak işlem. javadoc for java.sql.Connection'a göre, davranış uygulamaya bağlıdır. Bu nedenle, hata durumunda rollback'u kendi başınıza yapmazsanız kısmi güncellemelere son verebilirsiniz.

+0

Ama daha sonra yakalama blokunda geri dönüşün olması zarar görmediğini söyleyebilir miydiniz? Ben haklı mıyım – Rox

+2

@Rox Sadece istenmeyen etkilerden kaçınmak istiyorsanız, bu zarar vermez. –