Одна транзакция на запрос с помощью Spring MVC и Hibernate - PullRequest
0 голосов
/ 01 февраля 2019

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

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

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

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

1 Ответ

0 голосов
/ 01 февраля 2019

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

См. источник

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...