【问题标题】:GWT RequestFactory and Spring-managed transactionsGWT RequestFactory 和 Spring 管理的事务
【发布时间】:2013-07-04 13:41:35
【问题描述】:

我正在开发一个 GWT 2.5.1 + Spring 3.2 + Hibernate 4 项目。 Spring-Hibernate 应用程序已经在工作并且具有通常的 Service/Dao 层。事务由 Spring 通过服务方法上的 @Transactional 注释处理。

我正在尝试使用 GWT RequestFactory 在其上添加 GWT 层。 特别是,我不明白 RequestFactory 和 Spring 管理的事务应该如何协同工作。

在实际调用请求的服务方法之前和之后,RequestFactory 似乎执行了很多查询(参见 Locator 类的 find/getId 方法)。 顺便说一句:Locator 是否应该依赖 Spring 服务 bean 来执行这些查询?我想是的。

这意味着 RequestFactory 在不同的事务中做事,这是不好的。 我希望整个请求发生在同一个事务中以利用 Hibernate 缓存(嗯,这只是主要原因)。

我认为@Transactional 注释应该以某种方式向上移动到 GWT 服务器层,但它们必须在 Spring bean 上才能工作,所以...

集成 GWT RequestFactory 和 Spring 管理的事务的最佳方式是什么?

【问题讨论】:

    标签: spring hibernate gwt transactions requestfactory


    【解决方案1】:

    托马斯是对的。您需要使用 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 注释您的服务类或方法。

    【讨论】:

    • 你需要使用ServiceLocator从Spring加载服务。
    • 谢谢,这工作正常。至于 RequestFactory-Spring 集成...我找到了几个可行的解决方案:1)jsinghfoss.tumblr.com/post/18216239637/… 2)groups.google.com/forum/#!msg/google-web-toolkit/IQInsMnPtT0/…(第二篇文章)我仍然不确定哪个更好。第二个比较简单,但是每次都需要获取ApplicationContext。
    • 无论如何,基本思想如下: 1) 为 GWT 的 RequestFactoryServlet 构造函数提供一个自定义的 ServiceLayerDecorator。 2)装饰器负责检索EntityLocators(Locator接口)和ServiceLocators,它们是Spring管理的bean。 3) 您只需要 1 个 ServiceLocator。负责检索任何 Spring 服务 bean。 4)您至少需要 1 个 EntityLocator,具体取决于域实体的实现方式。 5)EntityLocatord直接使用JPA EntityManager(或Hiberante SessionFactory)...添加上面的过滤器,一切就位了。 :)
    • 我刚刚完成了 DynatableRequestFactory 的改编版本,它使用 Spring 和 Hibernate 来查找服务和持久化数据:github.com/gerbrand/gwt-dynatablerf-spring
    【解决方案2】:

    我无法判断 Spring 集成,但 RequestFactory 期望:

    • 每个请求一个会话,即“在视图中打开会话”(因此在整个请求中使用相同的 Hibernate 缓存)
    • 每个服务方法一个事务

    所以你关于 “RequestFactory 在不同的事务中做事的观点,这是不好的。我希望整个请求发生在同一个事务中以利用 Hibernate 缓存” 没有实际意义,而且是错误的。

    【讨论】:

    • 感谢您指出正确的方向。我很惊讶官方文档中没有解释这些。
    • 是的,我知道……如果您觉得受到启发,请随时为文档发送补丁:gwtproject.org/makinggwtbetter.html(跟踪器中也存在错误)
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 2017-02-20
    • 2014-02-22
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多