Я обновляю свое приложение с Spring3 до Spring 4. В моем существующем приложении мы использовали OpenSessionInViewInterceptor
, который создает транзакцию вместе с новым запросом.
Теперь я также использую JPA, поэтому, даже если я использую OpenEntityManagerInViewInterceptor
, он не связывает транзакции с ним. Поэтому мне пришлось вручную вводить транзакцию во всех моих методах контроллера.
Из-за унаследованного кода классы контроллеров имеют много бизнес-логики вместо того, чтобы правильно распределить ее по уровню обслуживания.
Теперь, если я добавлю аннотацию @Transctional
в метод контроллера, тогда он не будет работать, тогда как если я использую транзакцию вручную через DefaultTransactionDefinition
, то она будет работать правильно.
Кроме того, если я удаляю бизнес-логику методов контроллера для уровня обслуживания и помещаю аннотацию @Transactional
в уровень обслуживания, то она также работает нормально. Но эти изменения утомительны, и мое приложение очень большое, поэтому не могу этого сделать.
Пожалуйста, дайте мне знать, почему @Transactional
не работает в моем случае, если я вставлю его в контроллер, как мне заставить его работать.
Я не использую AspectJ для управления транзакциями.
Испытанные подходы:
- Код в обоих местах: код в dispatcher-servlet.xml вместе с appliacationContext.xml, но все равно транзакции контроллера терпят неудачу.
- Перемещен bean-компонент для urlMapping в applicationContext.xml, но все равно он не работает.