GWT RequestFactory:如何对每个请求使用单个EntityManager

GWT RequestFactory:如何对每个请求使用单个EntityManager,gwt,code-injection,cdi,entitymanager,requestfactory,Gwt,Code Injection,Cdi,Entitymanager,Requestfactory,为了将RequestFactory发送到,我需要确保对每个请求使用相同的EntityManager 我根据ThreadLocal实现拼凑了自己的工厂类,但我不确定如何正确释放资源(例如,如何知道请求已完成并调用close()) 有没有一种简单的方法可以确保在给定的ServletRequest中使用单个EntityManager,而不必求助于J2EE/CDI上的完整版本?如果必须的话,我会选择这条路线,但我希望保持简单,特别是因为我想继续使用GWT附带的轻量级开发服务器。DynaTableRf示例

为了将
RequestFactory
发送到,我需要确保对每个请求使用相同的
EntityManager

我根据
ThreadLocal
实现拼凑了自己的工厂类,但我不确定如何正确释放资源(例如,如何知道请求已完成并调用
close()


有没有一种简单的方法可以确保在给定的ServletRequest中使用单个EntityManager,而不必求助于J2EE/CDI上的完整版本?如果必须的话,我会选择这条路线,但我希望保持简单,特别是因为我想继续使用GWT附带的轻量级开发服务器。

DynaTableRf示例应用程序通过添加servlet过滤器在其文件中设置持久性上下文来做类似的事情。或者,当
super.doPost()
返回时,您可以将其子类化并重写其
doPost()
方法,以在
finally
块中拆下
EntityManager

以下是我根据和的反馈最终得出的结论

为EntityManager创建线程本地保持器;当实体需要获取EntityManager时,请在实体中引用此选项:

public class ThreadLocalEntityManager
{
    private static ThreadLocal<EntityManager> holder = new ThreadLocal<EntityManager>();

    private ThreadLocalEntityManager()
    {
    }

    public static EntityManager get()
    {
        return holder.get();
    }

    public static void set(EntityManager em)
    {
        holder.set(em);
    }
}
然后将筛选器应用于/gwtRequest URL模式:

<filter>
    <filter-name>PersistenceFilter</filter-name>
    <filter-class>com.example.PersistenceFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>PersistenceFilter</filter-name>
    <url-pattern>/gwtRequest</url-pattern>
</filter-mapping>

持久性过滤器
com.example.PersistenceFilter
持久性过滤器
/gwtRequest
请注意,这里有一个缺陷-无论底层代码是否使用该servlet,都会为通过该servlet的每个请求创建EntityManager。它可能会变得更加健壮,并且只有在请求时才以某种方式懒洋洋地创建EntityManager(和事务)

但到目前为止,这段代码似乎与
RequestFactory
配合得很好。欢迎提出改进建议


注意:这段经历告诉我,完全使用CDI可能值得一试,而不是尝试实现像这样的部分。在这个项目中,我只是没有时间进行这样的移动

如果使用Spring,只需将OpenEntityManagerView servlet过滤器添加到web.xml中即可

<filter>
    <filter-name>entityManagerFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>entityManagerFilter</filter-name>
    <url-pattern>/gwtRequest</url-pattern>
</filter-mapping>

实体管理过滤器
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
实体管理过滤器
/gwtRequest

再次感谢您,BobV。我正在尝试servlet过滤器方法。每个请求使用一个EntityManager,这当然解决了我的RequestFactory问题。但现在我正在泄漏资源。它总是有意义的。:-)一旦我解决了bug,我会回来总结。我怀疑你会有很多不需要EntityManager的请求通过这个过滤器。这正是我所做的,对我来说也很好!在appengine上,事务位不起作用,但在JDO中打开和关闭持久性管理器也很有效。
<filter>
    <filter-name>entityManagerFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>entityManagerFilter</filter-name>
    <url-pattern>/gwtRequest</url-pattern>
</filter-mapping>