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?
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to