Как правильно ловить, переносить и перебрасывать исключения Hibernate? - PullRequest
3 голосов
/ 05 октября 2011

Мой работник базы данных реализован выше Hibernate. Если что-то идет не так, его методы должны откатить транзакцию и выдать SQLException. Итак, мой вопрос: каков наилучший (т.е. самый чистый) способ обработки исключений Hibernate? В настоящее время все мои методы выглядят так же ужасно, как это:

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

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Не лови их вообще. Исключения Hibernate расширяют RuntimeException по двум причинам: вам не нужно объявлять их в сигнатурах методов, а любое RuntimeException автоматически вызывает откат транзакции. Обработка исключений делает для очень загроможденного кода. Люди Hibernate придерживаются философии, что HibernateExceptions должны быть фатальными ошибками, сигнализацией кодирования или логическими ошибками, и в приложении с надлежащим функционалом не должно (и не должно быть) обнаруживаться.

Пользовательский интерфейс вашего приложения должен реагировать на эти сюрпризы в удобной для пользователя форме. Это отдельная проблема.

2 голосов
/ 05 октября 2011

Пусть кто-нибудь еще справится с этим, например, Spring. Он имеет расширенную поддержку Hibernate и транзакций , которая извлечет весь код, который вас беспокоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...