我想创建一个能够执行一些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()。
我做错了什么?有没有办法实现我的需要?
感谢。