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(
       if (emf != null) {

      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();
       try {
       // process the request here...
       } catch (Exception e) {
       // log the error
       } finally {

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