[jboss-user] Using Java Persistence from web tier

Mikael Ståldal mikael.staldal at univits.com
Mon Jul 16 08:41:45 EDT 2007


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?



More information about the jboss-user mailing list