GWT RequestFactory и Spring-транзакции
Я работаю над проектом GWT 2.5.1 + Spring 3.2 + Hibernate 4. Приложение Spring-Hibernate уже работает и имеет обычные слои Service/Dao. Транзакции обрабатываются Spring посредством аннотаций @Transactional для методов обслуживания.
Я пытаюсь добавить слой GWT поверх него, используя GWT RequestFactory. В частности, я не понимаю, как транзакции RequestFactory и управляемые Spring должны работать вместе.
Похоже, что RequestFactory выполняет много запросов (см. Методы find / getId класса Locator) до и после фактического вызова запрошенного метода службы. Кстати: должен ли Locator полагаться на bean-компонент службы Spring для выполнения этих запросов? Полагаю, что так.
Это означает, что RequestFactory работает в разных транзакциях, что плохо. Я хочу, чтобы весь запрос выполнялся в одной транзакции, чтобы использовать кеш Hibernate (ну, это только основная причина).
Я думаю, что аннотации @Transactional должны быть каким-то образом перемещены на уровень сервера GWT, но для работы они должны быть в компоненте Spring, так что...
Каков наилучший способ интеграции GWT RequestFactory и транзакций, управляемых Spring?
2 ответа
Томас прав. Вам нужно использовать шаблон Open Session in View. относительно Spring
интеграция:
Просто добавьте это в ваш web.xml:
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>entityManagerFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Аннотируйте свои классы обслуживания или методы с @Transactional
,
Я не могу сказать об интеграции Spring, но RequestFactory ожидает:
- один сеанс на запрос, иначе "открытый сеанс в представлении" (так что один и тот же кеш Hibernate используется во всем запросе)
- одна транзакция на метод обслуживания
Так что ваша точка зрения о "RequestFactory" делает вещи в разных транзакциях, что плохо. Я хочу, чтобы весь запрос произойдет в той же транзакции, чтобы воспользоваться кэшем Hibernate"является спорным и неправильно.