Spring AOP Transaction Management и Hibernate: нежелательные фиксации в базе данных - PullRequest
2 голосов
/ 28 октября 2011

Возможно ли включить транзакции для методов, выполняющих вызовы только для методов DAO (объекта доступа к данным)?

class BusinessLayerFacade implements Facade {</p> <pre><code>//no transaction handling allowed here public X foo() { //do something } public Y changed(DomainObject myObject) { //do something //<-- start transaction // calling DAO //do something // calling DAO //<-- end transaction }

}

Разрешитьтранзакции для всех методов в BusinessLayerFacade вызывают некоторые нежелательные фиксации в базе данных.Например, когда foo () вызывается, выдается Exception при выполнении changed(DomainObject myObject), myObject передается в базу данных вместо отмены изменений при откате транзакции.

Есть идеи?

Это определенно возможность фильтровать методы по имени. Но не могли бы мы добавить немного магии ;-) Можно ли начать транзакцию при первом вызове метода DAO в changed() и начать коммит , вернувшись с changed().Если это возможно, мне не нужно быть осторожным, называя новые методы в классе.

Спасибо, Стефан

Ответы [ 2 ]

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

Все, что вам нужно, это совет TX уровня метода:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
      <tx:method name="changed*" propagation="REQUIRES_NEW" rollback-for="Throwable"/>
   </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(* my.package.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
1 голос
/ 28 октября 2011

Транзакция откатывается, если выдается исключение времени выполнения.Нет, если выдается исключение для приложения.Вы можете настроить это, применив аннотацию @Transactional:

@Transactional(rollbackFor=SomeException.class, noRollbackFor=SomeOtherException.class)

Это также можно настроить глобально в XML, используя атрибуты rollback-for и no-rollback-for элемента tx:method.

Подробнее см. Справочную документацию Spring .

...