users@glassfish.java.net

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

From: emiddio-frontier <emiddio_at_frontier.com>
Date: Sun, 12 Dec 2010 20:06:58 -0800

so how to do it with JNDI --i have not seen the way to do it ??? what is the
name to lookup???

my persistence.xml says:
<persistence-unit name="EmployeeService" transaction-type="JTA" >
...



and the API for javax.persistence.Persistence says:
public class Persistenceextends java.lang.ObjectBootstrap class that is used
to obtain an EntityManagerFactory in Java SE environments.

The Persistence class is available in a Java EE container environment as
well; however, support for the Java SE bootstrapping APIs is not required in
container environments.

so it is supposed to work in java EE also.



gary





----- Original Message -----
From: "Sahoo" <sanjeeb.sahoo_at_oracle.com>
To: <users_at_glassfish.java.net>
Cc: "emiddio-frontier" <emiddio_at_frontier.com>; <nbj2ee_at_netbeans.org>;
<users_at_glassfish.dev.java.net>
Sent: Sunday, December 12, 2010 6:52 PM
Subject: Re: EE5 JPA with JTA/UserTransaction -- non-Container managed
transactions


> Persistence.createEMF()
> is not same as
> @PersistenceUnit
> EMF emf;
>
> If you don't like injection, you can look up emf using JNDI and that will
> give you same behavior, but Persistence.creatEMF is called "Java SE" style
> of obtaining an EMF and that's not recommended to be used in EE apps, for
> in Java SE, things like JTA may not be supported by the EMF. In fact,
> unless you explicitly configure transaction-type in your persistence.xml,
> the default value is RESOURCE_LOCAL for Java SE and JTA for Java EE.
>
> I am quite sure the spec says all these things.
>
> Sahoo
> On Monday 13 December 2010 06:31 AM, emiddio-frontier wrote:
>> 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
>>
>