Проблема иерархии классов с использованием @Transactional
Настройка проекта: Spring 3.0.5 / JPA 2 / Hibernate / @Transactional
Мы работаем с несколькими различными источниками данных (и, следовательно, с разными менеджерами транзакций), но у нас есть общие базовые классы службы, так как многие функции используются повторно.
Поэтому мы подумали, что решим это с помощью пользовательских аннотаций. Мы определяем все методы в абстрактном базовом классе и создаем один пустой класс реализации для каждого менеджера транзакций.
Теперь проблема заключается в следующем:
В AbstractFallbackTransactionAttributeSource
, это поиск, который делается:
TransactionAttribute txAtt = findTransactionAttribute(specificMethod);
// ...
// Second try is the transaction attribute on the target class.
txAtt = findTransactionAttribute(specificMethod.getDeclaringClass());
Сначала проверяется метод, затем класс, который объявляет метод (и его предков). Но в нашем контексте пользовательская аннотация находится в подклассе, который не может быть найден при переходе вверх.
Итак, как мы можем решить эту проблему?
[Я также задавал этот вопрос на весеннем форуме сообщества ]
2 ответа
В настоящее время мы решили эту проблему, предоставив
- наш собственный подкласс
AnnotationTransactionAttributeSource
который сначала выполняет поиск целевого класса, а затем делегирует суперкласс -
BeanFactoryPostProcessor
что заменяет нашу реализацию оригинальнойAnnotationTransactionAttributeSource
определение бина, которое создается внутри<tx:annotation-driven>
,
Отличный улов. Я не знаю хорошего решения, но в качестве обходного пути вы можете переопределить эти методы в реализации следующим образом:
@Override
void method(...)
// Just to work around a bug in AbstractFallbackTransactionAttributeSource
super.method(...);
}
это сделает @Transactional
видно но это некрасиво