Одна транзакция на запрос с помощью Spring MVC и Hibernate
Я хочу использовать Spring MVC и Hibernate. Я не хочу использовать сервисный слой или @Transactional
атрибут во всех методах контроллера (или, скорее, я хочу, чтобы Spring рассматривал их как транзакционные). Поэтому я хочу начать транзакцию, когда метод контроллера начинает работать с базой данных, и зафиксировать транзакцию, когда метод контроллера возвращает ViewAndModel или транзакцию отката, если произошла какая-либо ошибка. Также я хочу, чтобы view поддерживал отложенную загрузку в спящем режиме, например, выбирал данные в режиме автоматической фиксации, если HTML-шаблон запрашивает это.
Я знаю, что передовая практика предусматривает создание отдельного уровня обслуживания с @Transactional
атрибут, но мое приложение не получит выгоды от этой дополнительной сложности, и я хочу максимально упростить код.
Я узнал, что OpenSessionInViewInterceptor
позволяет продолжить использование сеанса гибернации в поле зрения, что, вероятно, решает мое второе требование. Но как мне сделать все методы контроллера транзакционными?
В идеале я хочу простой способ отказаться от этого поведения, если мне это когда-нибудь понадобится. Например, все методы являются транзакционными, но я могу применить что-то вроде @NonTransactional и более детально управлять транзакциями.
1 ответ
На самом деле OpenSessionInViewInterceptor
откроет сеанс (и неявно транзакцию) до запуска любого кода вашего контроллера и закроет его непосредственно перед завершением http-запроса. Так что это должно решить оба ваших требования.
Посмотреть источник
То же самое верно для OpenEntityManagerInView
,