Сессия гибернации становится недействительной после исключения ConstraintViolationException - PullRequest
9 голосов
/ 24 февраля 2011

Есть ли способ продолжить использование привязанного к потоку сеанса гибернации после того, как было сгенерировано исключение ограничения?Я привожу короткий пример здесь:

    Parent other=service.load(33); // loads a new parent
    try {
        Parent p=new Parent();
        p.setName("A name");
        service.save(p); // a @Transactional spring service class, throws ConstraintViolationException - name should be at least 15 characters long
    } catch (ConstraintViolationException e){
        // i would like to handle validation errors and proceed normally
        // but the session is allready closed here
    }
    System.out.println("Children: " + other.getChildren()); // lazy initialization exception, even when using opensessioninview

Отныне сеанс гибернации совершенно бесполезен даже для операций только для чтения, таких как рендеринг отложенной коллекции в представлении с использованием шаблона OpenSessionInView.

Ответы [ 2 ]

12 голосов
/ 24 февраля 2011

Сессия * В документации указано, что Если сессия вызывает исключение, транзакция должна быть откатана, а сессия отброшена.Внутреннее состояние сеанса может не соответствовать базе данных после возникновения исключения. .

AFAIK, от этого нет способа восстановиться, я вспоминаю, как кто-то на работе предупреждал меня не использовать шаблон сеанса для запроса / OpenSessionInView из-за подобных проблем.

5 голосов
/ 19 марта 2012

Используйте StatelessSession вместо Session.Это хитрость.

С помощью StatelessSession вы можете продолжить после любых исключений, насколько это возможно в SQL (даже внутри одной транзакции - hibernate не выполняет фиксацию / откат).Это идеально для массовых обновлений / вставок или для проверки нарушения уникальных ограничений.

Но будьте осторожны, StatelessSession имеет много ограничений по сравнению с обычным сеансом.Пожалуйста, обратитесь к документации Hibernate / Javadocs для этого.

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