2016-02-15 5 views
0

В настоящее время я использую openSession(), начинаю и фиксирую транзакцию в методе с классическими дао и слоями услуг и сохраняю/обновляю/удаляю несколько объектов в нем. Если какая-либо ошибка существует, я уверен, что никакого сохранения/обновления в этом методе не было сделано.Spring getCurrentSession() и сохранить объект sevaral

Возможно ли сохранить более одного объекта в методе, вызванном с помощью аннотации @Transactional через getCurrentSession(), и это безопасно, если это гарантирует, что все объекты в этом методе сохранены/обновлены или какие-либо еще не выполнены? И если возможно, как я могу использовать откат в этом методе?

+0

Вы должны использовать getCurrentSession вместо открытия нового сеанса каждый раз. Вы можете сохранить столько объектов, сколько хотите, когда у вас есть сеанс. Если вы хотите, вы можете заменить все строки базы данных. –

+0

Например, если я попытаюсь удалить все строки (или обновить их и удалить некоторые) в методе через getSurrentSession(), он не остановится после удаления нескольких строк (обновленный, но не удаленный), если возникнет какая-либо проблема или соединение потерял, не так ли? Я должен быть уверен, что все изменения сделаны в этом методе. – devrim

+0

Ваш способ сказать, что проблема странная, но могу сказать, что вы можете выполнять несколько операций. –

ответ

1

Да, вы можете с правильной транзакционной семантикой. @Transactional имеет имущество под названием rollbackFor = TypeOfException.class. По умолчанию он откатывается RuntimeException, но вы можете указать свой собственный или просто Exception для любого проверенного исключения.

Вы должны иметь правильное распространение, которое также можно указать как свойство на @Transactional. Обратите внимание, что если вы установили propagation = REQUIRES_NEW, и существующая транзакция вызывает этот метод, это приведет к откату только для вложенных транзакций. То, что вы пытаетесь достичь, наиболее распространенным я считаю: propagation = REQUIRED - это не будет работать по собственной транзакции, но продолжит работу над существующим, а это значит, что в случае сбоя вся транзакция будет отката.

+0

Я использую распространение = ТРЕБУЕТСЯ, тогда я узнал, что это уже настройка по умолчанию. Поэтому я не добавил. Кажется, мне нужно только изменить openSession() на getCurrentSession() и добавить @Transactional. Весна сделает все остальное. – devrim

+0

Да, вы должны использовать getCurrentSession(), пружина также будет скрыта в конце. – isah

+0

Ok Спасибо всем. Это очень полезно для меня – devrim