users@glassfish.java.net

EE5 JPA with JTA/UserTransaction -- non-Container managed transactions

From: emiddio-frontier <emiddio_at_frontier.com>
Date: Sun, 12 Dec 2010 17:01:50 -0800

  Why does code like:
emf =
javax.persistence.Persistence.createEntityManagerFactory("EmployeeService");
provide an emf that will not work properly?

see more info below:

Rather than code like:

@PersistenceUnit(unitName = "EmployeeService")
public EntityManagerFactory emf;
@Resource
public UserTransaction utx;

the JavaEE API says one can do the following:

public EntityManagerFactory emf;
public UserTransaction utx;

and initialize emf and utx like:

InitialContext ic = new InitialContext();
utx = (UserTransaction) ic.lookup("java:comp/UserTransaction");
emf =
javax.persistence.Persistence.createEntityManagerFactory("EmployeeService");
-----------------------------------------------------------------------

Within a Servlet with JTA/JPA, code like the shown below works as long
as emf
is only obtained with/via the @PersistenceUnit annotation;

EntityManager em = emf.createEntityManager();
utx.begin();
em.joinTransaction();
Employee emp = em.find(Employee.class, id);
utx.commit();

the above code works if utx is obtained as a
@Resource
public UserTransaction utx;

or as

utx = (UserTransaction) ic.lookup("java:comp/UserTransaction");


the code fails if emf is obtained as
emf =
javax.persistence.Persistence.createEntityManagerFactory("EmployeeService");

as opposed to
@PersistenceUnit(unitName = "EmployeeService")
public EntityManagerFactory emf;

the Java EE5/6 API say it should work.

thanks

gary