3 Stimmen

Wie fängt man eine Hibernate-Ausnahme richtig ab, verpackt sie und wirft sie erneut aus?

Mein Datenbank-Worker ist oberhalb von Hibernate implementiert. Wenn etwas schief geht, sollten seine Methoden die Transaktion zurücksetzen und eine SQLException . Meine Frage ist also: Was ist der beste (d.h. sauberste) Weg, um Hibernate-Ausnahmen zu behandeln? Derzeit sehen alle meine Methoden so hässlich aus wie diese:

public EntryUserHib addUser(final String username, final String pwdhash) throws SQLException{
    try {
        final Transaction ta = sess.beginTransaction();
        try {
            // Using Hibernate here
            // "return" statement
        } catch(final HibernateException ex) {
            try {
                ta.rollback();
            } catch(final Exception ex1) {}
            throw ex;
        } finally {
            if (!ta.wasRolledBack()) ta.commit();
        }
    } catch(final HibernateException ex) {
        if (ex.getCause() != null) {
            if (ex.getCause() instanceof SQLException) throw (SQLException)ex.getCause();
            throw new SQLException(ex.getCause());
        }
        throw new SQLException(ex);
    }
}

3voto

RichW Punkte 1966

Fangen Sie sie gar nicht erst ein. Hibernate-Ausnahmen erweitern RuntimeException aus zwei guten Gründen: Sie müssen nicht in Methodensignaturen deklariert werden, und jede RuntimeException führt automatisch zu einem Rollback der Transaktion. Die Behandlung von Ausnahmen macht den Code sehr unübersichtlich. Die Hibernate-Leute vertreten die Philosophie, dass HibernateExceptions fatale Fehler sein sollten, die Codierungs- oder Logikfehler signalisieren, und in einer korrekt funktionierenden Anwendung nicht abgefangen werden sollten (und auch nicht abgefangen werden müssen).

Die Benutzeroberfläche Ihrer Anwendung sollte jedoch auf diese Überraschungen in einer benutzerfreundlichen Weise reagieren. Das ist ein anderes Thema.

2voto

Ryan Stewart Punkte 120600

Überlassen Sie die Verwaltung jemand anderem, zum Beispiel Spring. Es hat umfassende Unterstützung von Hibernate und Transaktionen die den gesamten Code, über den Sie sich Sorgen machen, extrahieren wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X