Hibernate Сохранить, Hibernate Откат - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь заставить мой DAO работать следующим образом:

    public void incrementNumber(long id) throws Exception{
        Session session = factory.openSession();
        Number n = (Number)session.load(Number.class, id);
        n.setNumber(n.getNumber() +5);
//      throw new IllegalArgumentException("BLAH");
        session.close();
    }
  1. При комментировании исключения обновление будет зафиксировано.
  2. Откомментированием (?) Исключение составляет откат.

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

Ответы [ 2 ]

1 голос
/ 27 октября 2011

DAO в основном отвечает за постоянные операции. Он должен предоставлять только CRUD и некоторые методы поиска, относящиеся к конкретной сущности.

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

Итак, ваш NumberDAO может выглядеть так:

public class NumberDAO {

     public Number loadById(long id){ }

}

А ваш NumberService может выглядеть так:

public class NumberService{

        //Inject by DI containers , or setter / constructor
        NumberDAO numberDAO;

         public void incrementNumber(long id , int increaseAmount) throws Exception{

                Number n = (Number) numberDAO.loadById(id);

                if (XXXXXXXX) 
                    throws new IllegalArgumentException("BLAH BLAH BLAH BLAH");

                n.setNumber(n.getNumber() +increaseAmount);
         }

}

Поскольку вы используете аннотацию транзакции в слое сервиса, она автоматически фиксируется, если ваш метод сервиса возвращается успешно. В случае возникновения каких-либо исключений до возврата метода транзакция автоматически откатывается.

0 голосов
/ 12 июля 2018

commit не всегда фиксирует в БД, он устанавливает в кеше сессии, что это должно быть зафиксировано, затем, когда вы выполните сброс (также в зависимости от конфигурации), коммит перейдет в БД или когда сеанс / транзакция заканчивается.

Так что, если вы хотите форсировать его, используйте flush () после коммита. Если вы можете ждать проверки после закрытия сессии / транзакции.

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