使用JPA实现Java Servlet数据库访问

时间:2013-12-31 10:45:53

标签: java servlets jpa jndi

看过很多关于如何从Java Servlet使用JNDI DataSource的例子,我还没有找到如何在Servlet上下文中将JNDI与JPA结合使用的示例。

我的方案的基本概要是:

  1. Java Servlet
  2. 包含JPA实体和persistence.xml的外部项目
  3. 我想在ServLet中使用JPA
  4. 许多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的新手,我想更加确定。

    我的这个计划是完全奇怪还是我以任何方式使事情过于复杂?

0 个答案:

没有答案