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);
}
}
Поскольку вы используете аннотацию транзакции в слое сервиса, она автоматически фиксируется, если ваш метод сервиса возвращается успешно. В случае возникновения каких-либо исключений до возврата метода транзакция автоматически откатывается.