Одна транзакция на запрос с помощью Spring MVC и Hibernate

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

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

Я узнал, что OpenSessionInViewInterceptor позволяет продолжить использование сеанса гибернации в поле зрения, что, вероятно, решает мое второе требование. Но как мне сделать все методы контроллера транзакционными?

В идеале я хочу простой способ отказаться от этого поведения, если мне это когда-нибудь понадобится. Например, все методы являются транзакционными, но я могу применить что-то вроде @NonTransactional и более детально управлять транзакциями.

1 ответ

На самом деле OpenSessionInViewInterceptor откроет сеанс (и неявно транзакцию) до запуска любого кода вашего контроллера и закроет его непосредственно перед завершением http-запроса. Так что это должно решить оба ваших требования.

Посмотреть источник

То же самое верно для OpenEntityManagerInView,

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