wake-up-neo.com

Wie gehe ich mit Verstößen gegen die JPA-Richtlinien um?

Wenn eine eindeutige Einschränkung verletzt wird, wird ein javax.persistence.RollbackException ausgelöst. Es kann aber mehrere Gründe geben, eine RollbackException zu werfen. Wie kann ich herausfinden, dass eine eindeutige Einschränkung verletzt wurde?

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

Wie kann ich herausfinden, dass eine eindeutige Einschränkung verletzt wurde?

Ausnahmen sind verkettet, Sie müssen getCause() rekursiv aufrufen, um die anbieterspezifische Ausnahme zu erhalten (und möglicherweise zur SQLException gehen), um sie in etwas zu übersetzen, das Ihre Anwendung für Ihren Benutzer gut verarbeiten kann. Im Folgenden wird die Ausnahmekette gedruckt:

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

Für die Ausnahmebehandlung und die "Übersetzung" können Sie etwas tun, was Spring tut (siehe die verschiedenen JpaDialect-Klassen, z. B. HibernateJpaDialect , um eine Idee zu erhalten).

Das alles ist nicht schön, dieser Code wird nicht portabel sein und es ist nicht einfach, herauszufinden, welche Attribute die Verletzung verursacht haben. Dies bestätigt in gewisser Weise, dass es keinen eleganten und portablen Weg gibt, um mit JPA bedingte Verstöße zu behandeln.

17
Pascal Thivent

Verwenden Sie e.getCause(), um die Ursache des Rollbacks zu untersuchen.

3
Aaron Digulla

compiler gibt die Ausnahme SQLIntegrityConstraintViolationException zurück, während versucht wird, die eindeutige Einschränkung zu verletzen. 

Verwenden Sie das folgende catch-Block-Konzept, um richtige Ausnahmen zu behandeln.

catch(SQLIntegrityConstraintViolationException e) 
{
  // Error message for integrity constraint violation
}
catch(Exception e)
{
 // Other error messages
}
1
abhijitcaps

Sie können Folgendes verwenden:

Wenn Sie Federrahmen verwenden, können Sie Folgendes verwenden:

org.springframework.dao.DataIntegrityViolationException

Wenn Standard-JPA verwendet werden kann

org.hibernate.exception.ConstraintViolationException

Auf SQL-Ebene kann folgendes verwendet werden:

Java.sql.SQLIntegrityConstraintViolationException

1
AaMng

Das könnte für Sie sehr spät sein, aber ich habe es für PostGres gelöst.

catch (DataIntegrityViolationException e) {

            for (Throwable t = e.getCause(); t != null; t = t.getCause()) {

                if (PSQLException.class.equals(t.getClass())) {
                    PSQLException postgresException = (PSQLException) t;

                    // In Postgres SQLState 23505=unique_violation
                    if ("23505".equals(postgresException.getSQLState())) {
                        throw new CustomDataAlreadyExistsException("YourErrorCode", e);
                    }
                }
            }
            throw new SomeOtherException("YourErrorCode2", e);

        }
1
AjayPS

Das kannst du so machen:

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.

Und dann die Informationen zur Ausnahme anzeigen.

0
Mercy

ich denke, das Drucken der Stapelspur wird Ihnen helfen, dies zu wissen. e.printStackTrace ();

0
hakish