Я экспериментирую с использованием шаблона команды, чтобы позволить моему веб-уровню работать с объектами Hibernate в контексте одной транзакции (таким образом, избегая ленивых загрузочных исключений). Я, однако, теперь запутался в том, как я должен разбираться с транзакциями.
Мои команды вызывают методы уровня обслуживания, которые аннотируются аннотациями @Transactional
. Некоторые из этих методов уровня обслуживания доступны только для чтения - например, @Transactional(readOnly=true)
- и некоторые из них читаются/записываются.
Мой сервисный уровень предоставляет обработчик команд, который выполняет команды, переданные ему от имени веб-уровня.
@Transactional
public Command handle( Command cmd ) throws CommandException
Я предполагаю, что я прав, сделав метод обработчика команд handle()
транзакционным. Здесь возникает путаница. Если реализация команды вызывает вызовы для нескольких методов уровня обслуживания, для обработчика команд не существует способа узнать, будут ли операции, вызываемые внутри команды, только для чтения, чтения/записи или комбинации из двух.
Я не понимаю, как работает распространение в этом примере. Если я должен был сделать метод handle()
readOnly=true
, то что произойдет, если команда затем вызовет метод уровня сервиса, который аннотируется с помощью @Transactional(realOnly=false)
?
Буду признателен за лучшее понимание этого и приветствую ваши комментарии...
Эндрю