0 Replies Latest reply on Jul 17, 2007 7:15 AM by Mikael Ståldal

    Using JPA from web tier

    Mikael Ståldal Newbie

      What is the correct way of accessing a Java Persistence unit from the web tier (no EJB session beans)?

      I use JBoss 4.2.0.

      I can't get the resource injection annotations @PersistenceUnit or @PersistenceContext to work, so I have done like this:

      public class MyServletContextListener implements ServletContextListener {
      
       public void contextInitialized(ServletContextEvent sce) {
       try {
       EntityManagerFactory emf = Persistence.createEntityManagerFactory("myunit");
       sce.getServletContext().setAttribute(EntityManagerFactory.class.getName(), emf);
       }
       catch (RuntimeException e) {
       throw e;
       }
       catch (Exception e) {
       throw new RuntimeException(e);
       }
       }
      
       public void contextDestroyed(ServletContextEvent sce) {
       EntityManagerFactory emf = (EntityManagerFactory)sce.getServletContext().getAttribute(
       EntityManagerFactory.class.getName());
       if (emf != null) {
       emf.close();
       }
       }
      
      }
      


      and for each web request I do like this:

      EntityManagerFactory emf = (EntityManagerFactory)context.getAttribute(EntityManagerFactory.class.getName());
       EntityManager em = emf.createEntityManager();
       EntityTransaction transaction = em.getTransaction();
       transaction.begin();
      
       try {
       // process the request here...
       transaction.commit();
       } catch (Exception e) {
       transaction.rollback();
       // log the error
       } finally {
       em.close();
       }
      


      It seems to work, but is it thread-safe and does it give reasonable performance?