2010-12-28 4 views
1
try { 
     if (schId != null) { 
      log.info(">>> save"); 
      schedule = em.merge(schedule); 

      em.persist(schedule); 
     } else { 
      em.persist(schedule); 
     } 

     em.flush(); 
     ret = "ok"; 
    } catch (Exception err) { 
     ret = err.getMessage(); 
     err.printStackTrace(); 

     facesMessages.addFromResourceBundle(Severity.ERROR, "databaseError", ret); 
    } 

Wenn ich doppelte err.getMessage() kehrt Schlüsselfehler haben org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batchSeam/Hibernate - immer Meldung ORA Text

Im Stacktrace gibt dieser Fehler auch ist: java.sql.BatchUpdateException: ORA-00001: unique constraint (ACM.SCH_UK) violated

Wie kann ich das ORA-00001 erhalten Nachricht als Zeichenfolge anstelle des org.hibernate.exception.ConstraintViolationException Textes?

+0

was genau möchten Sie erhalten? Und warum Ihr Code momentan nicht erfolgreich ist (was ist das Ergebnis)? – Bozho

+0

Ich habe einen Zweitschlüssel absichtlich als Test eingegeben. Ich möchte dem Benutzer den ORA-Fehler auf dem Bildschirm anzeigen. – Guus

+0

Haben Sie versucht, 'err.getCause(). GetMessage()'? – kraftan

Antwort

2

java.sql.BatchUpdateException die Ursache Ihrer PersistenceException ist, können Sie es extrahieren wie folgt:

public static Throwable getRootCause(Throwable ex) { 
    while (true) { 
     Throwable cause = ex.getCause(); 
     if (cause == null) return ex; 
     ex = cause; 
    } 
} 

.

ret = getRootCause(ex).getMessage(); 
+0

Großartig, funktioniert! Vielen Dank! – Guus

Verwandte Themen