Проблема иерархии классов с использованием @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 ответа

Решение

В настоящее время мы решили эту проблему, предоставив

  1. наш собственный подкласс AnnotationTransactionAttributeSource который сначала выполняет поиск целевого класса, а затем делегирует суперкласс
  2. BeanFactoryPostProcessor что заменяет нашу реализацию оригинальной AnnotationTransactionAttributeSource определение бина, которое создается внутри <tx:annotation-driven>

,

Отличный улов. Я не знаю хорошего решения, но в качестве обходного пути вы можете переопределить эти методы в реализации следующим образом:

@Override
void method(...)
    // Just to work around a bug in AbstractFallbackTransactionAttributeSource
    super.method(...);
}

это сделает @Transactional видно но это некрасиво

Другие вопросы по тегам