看过很多关于如何从Java Servlet使用JNDI DataSource的例子,我还没有找到如何在Servlet上下文中将JNDI与JPA结合使用的示例。
我的方案的基本概要是:
许多googeling导致了以下方案。
在web.xml中,我已经注册了ServletContextListener
以及数据库定义:
<web-app>
...blah blah blah...
<listener>
<listener-class>my.company.MyContextListener</listener-class>
</listener>
... blah blah blah
<resource-ref>
<res-ref-name>jdbc/MyDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
...blah blah blah...
</web-app>
在context.xml中正确定义了resource-ref jdbc / MyDB的详细信息。
MyContextListener
只是实例化全局可访问的EntityBroker
:
public class MyContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
Map<String, String> props = new HashMap<String, String>();
props.put(PersistenceUnitProperties.JTA_DATASOURCE, "java:/comp/env/jdbc/MyDB");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("my-jpa", props);
event.getServletContext().setAttribute("RatingController", new EntityBroker(factory));
}
}
EntityBroker
是我发明的地方。基本上它只是EntityManagerFactory
的包装器,允许客户获得EntityManager
:
public class EntityBroker {
private final EntityManagerFactory factory;
public EntityBroker(EntityManagerFactory factory) {
this.factory = factory;
}
public EntityManager getManager() {
return factory.createEntityManager();
}
}
通过这种方式,我认为我能够满足使用JPA进行客户端数据库访问的所有未来需求,但作为Servlet的新手,我想更加确定。
我的这个计划是完全奇怪还是我以任何方式使事情过于复杂?