2010-08-17 29 views
19

Benzersiz bir kısıtlama ihlal edildiğinde, javax.persistence.RollbackException atılır. Ancak, RollbackException'u atmanın birden çok nedeni olabilir. Benzersiz bir kısıtlamanın ihlal edildiğini nasıl öğrenebilirim?JPA benzersiz kısıtlama ihlallerini nasıl ele alırım?

try { 
    repository.save(article); 
} 
catch(javax.persistence.RollbackException e) { 
    // how to find out the reason for the rollback exception? 
} 

cevap

17

Benzersiz bir kısıtlamanın ihlal edildiğini nasıl anlayabilirim?

İstisna sen sağlayıcı belirli istisna almak (ve belki aşağı SQLException gidin) başvurunuzun kullanıcı için güzel işleyebilir bir şey haline çevirmek için yinelemeli getCause() aramak zorunda zincirleme. istisna işleme ve "tercüme", siz (bir fikir edinmek için, örneğin HibernateJpaDialect çeşitli JpaDialect sınıflara bakınız) Bahar gelmez olduğumuz gibi birşey yapabileceğini için

for (t = e.getCause(); t != null; t = t.getCause()) { 
    logger.debug("Exception:" + t); 
} 

: Aşağıdaki istisna zincirini yazdırılır.

Tüm bu hoş değil, bu kod taşınabilir olmayacak ve hangi özniteliklerin ihlale neden olduğunu bulmak kolay olmayacak. Bu bir şekilde elegant and portable way to handle constraint violations in JPA'un olmadığını onaylar. benzersiz kısıtlamayı ihlal etmeye çalışırken

3

Geri sarmanın nedenini incelemek için e.getCause()'u kullanın.

+0

... ve sonra getCess(). GetMessag() '? – deamon

+0

Bu, hangi istisnai duruma göre değişir. Bir "SQLException" ise, hatayı ve SQLStatus'u denetleyin. Ancak Spring gibi bazı çerçeveler bunları daha anlamlı bir şeye çevirir ('DataIntegrityViolationException'). –

0

Yığın izinin yazdırılmasının bunu bilmenize yardımcı olacağını düşünüyorum. e.printStackTrace();

StringWriter writer=new StringWriter(); //remains the message from stack trace. 
e.printStackTrace(new PrintWriter(writer)); 
String message=writer.toString(); // gets the message of full stack trace. 

Sonra istisna bilgilerini görüntülemek:

+0

Manuel olarak istisnaları işlemeyi planlamıyorum :-) – deamon

0

Böyle yapabilirsiniz.

+0

Tamam, ama StackTrace ile ne yapmalıyım? Bir dizeyi yığın iziyle ayrıştırmak biraz çirkin, ama belki de tek olasılık. – deamon

+1

Ve hangi alanın kısıtlama ihlaline yol açtığını nasıl bilebilirim? – deamon

1

derleyici, istisna SQLIntegrityConstraintViolationException döndürür. Uygun istisnaları işlemek için aşağıdaki catch bloğu kavramını kullanın.

catch(SQLIntegrityConstraintViolationException e) 
{ 
    // Error message for integrity constraint violation 
} 
catch(Exception e) 
{ 
// Other error messages 
} 
İlgili konular