在servlet调度程序中注入EntityManagerFactory(非托管)

时间:2012-01-23 17:20:22

标签: java spring jpa ejb entitymanager

我想创建一个能够执行一些JPA操作的servlet调度程序。此servlet不得对Spring或EJB具有任何依赖性。所以,我的目的是以编程方式将EntityManagerFactory注入其中。然后,调度程序必须处理事务并在需要时创建/打开/关闭EntityManager。

所以我在示例应用程序中使用Spring 3和EclipseLink执行了此代码:

public class Initializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext context) {

        AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
        appContext.scan(...);
        appContext.refresh();

        EntityManagerFactory emf = appContext.getBean(EntityManagerFactory.class);
        MyDispatcher dispatcher = new MyDispatcher(emf);
        context.addServlet("my", dispatcher).addMapping("/my/*");
    }
}



public class MyDispatcher extends HttpServlet {
    ...

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        emf.createEntityManager();
        // java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManagerFactory.
    }
}

问题是当这个调度程序需要创建一个EntityManager时抛出IllegalStateException。调试我已经看到在实例化所有bean之后会自动调用EntityManagerFactoryImpl.close()。

我做错了什么?有没有办法实现我的需要?

感谢。

0 个答案:

没有答案