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"является спорным и неправильно.

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