Thanks for providing useful. Now the intricacies are becoming clear indeed !! I am trying to guess what could/should be the outcome of the following scenario.
*************** @PersistenceUnit(unitName="AccountUnit") EntityManagerFactory emf; [..] private void method1(int accountNumber, PrintWriter out) throws Exception{ try{ EntityManager em = emf.createEntityManager(); Context ctx = new InitialContext(); UserTransaction ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); ut.begin(); em.joinTransaction(); Account account = em.find(Account.class, accountNumber); account.setBalance(5000); method2(accountNumber,out); *account.setBalance(7000); (this update is missing in the table) * ut.commit(); }catch(Exception e){ throw e; } } private void method2(int accountNumber, PrintWriter out)throws Exception { try{ EntityManager em = emf.createEntityManager(); em.joinTransaction(); Account account = em.find(Account.class, accountNumber); account.setBalance(6000); }catch(Exception e){ throw e; } } ******************************** What I observed from the above code is *account.setBalance(7000); (this update is missing in the table). The value of balance column will be 6000. The last update in the method (to 7000) misses. Thanks Phani * On Thu, Jun 12, 2008 at 7:44 AM, David Blevins <[EMAIL PROTECTED]> wrote: > > > On Jun 9, 2008, at 1:43 AM, Phani Madgula wrote: > > Hi, >> I have tried to play with <jta-datasource> and <non-jta-datasource> as >> follows. >> >> I have the following peristence.xml in a web application. >> > [...] > >> >> <persistence-unit name="Tutorial" transaction-type="RESOURCE_LOCAL"> >> > [...] > > In the servlet, I have the following code >> > [...] > >> >> @PersistenceContext(unitName="Tutorial") >> private EntityManager em; >> ..... >> .... >> UserTransaction ut; >> try{ >> Context ctx = new InitialContext(); >> >> //ut = >> (UserTransaction)ctx.lookup("java:comp/UserTransaction"); >> //ut.begin(); >> >> //Uncomment EntityTransaction >> EntityTransaction et = em.getTransaction(); >> et.begin(); >> >> Book book = new >> Book("DDDDD","John",1.0,"Joe","1934834-23823","Phani"); >> em.persist(book); >> >> et.commit(); >> //ut.commit(); >> >> }catch(Exception e){ >> e.printStackTrace(); >> throw new ServletException (e); >> } >> *********************** >> I get the following error >> *********************** >> >> java.lang.IllegalStateException : You can not call getTransaction on >> a container managed EntityManager >> > > [...] > > Please note that I am using "RESOURCE_LOCAL" persistence unit. >> > > You're in the right direction. Try modifying this part of your servlet as > follows: > > [cut this part] > @PersistenceContext(unitName="Tutorial") > private EntityManager em; > > [redo as] > @PersistenceUnit(unitName="Tutorial") > private EntityManagerFactory emf; > > > The use of RESOURCE_LOCAL definitely requires you to use the > EntityTransaction API as you were attempting to do. It also requires you to > use the EntityManagerFactory to get your EntityManager. The implication of > the RESOURCE_LOCAL is that the EntityManager instance you create from the > factory *is* the entire persistence context, cache and all (EntityManger > instance == PersistenceContext, terminology wise). For illustrative > purposes it's safe to imagine big "cache" hashmap as a field inside the > EntityManager instance you created. It's not entirely how most providers do > it, but the technical ramifications are the same. One of the ramifications > is that if you want someone else to do persistent operations with the same > persistence context you need to find a way to get them the EntityManager > instance you created. From a spec perspective we (EJB 3.0 spec hat on) > could have allowed you to reference a RESOURCE_LOCAL unit via an > EntityManager reference, but the trick is that each reference would wind up > creating a new EntityManager instance, cache and all, and you could make a > really big mess; seemed better to just force you to create the instance > yourself and share it however you feel best so that there could be no > misunderstandings. > > With a TRANSACTION unit you are in fact required to lookup or have injected > the EntityManager and are not allowed to use the EntityManagerFactory or the > EntityTransaction API. As a vendor what we do underneath the covers is give > you an EntityManager wrapper that points to nothing. Then when a > transaction is started (via UserTransaction or a container transaction) we > use the EntityManagerFactory to create an EntityManager instance and make > all the wrappers point to it. When the transaction commits, the internal > EntityManager instance is discarded (cache goes bye-bye) and wrappers again > point to nothing. This is essentially why you need a transaction in > progress to use a EntityManager with JTA scope and TRANSACTION unit. With > an EXTENDED PersistenceContext (again, available only with a TRANSACTION > unit) things work pretty much the same except that the internal > EntityManager instance is *not* discarded and the end of transactions (cache > stays in memory and can be used again in another transaction), instead it > lives as long as the Stateful session bean holding it. > > My questions are >> >> 1. Should we always use UserTransaction object irrespective of >> <jta-datasource> or <non-jta-datasource> in JEE environment?? >> >> 2. How is the use of <non-jta-datsource> different from the use >> <jta-datasource> in JEE environment?? >> >> 3. In EJBs, when ContainerManaged Transactions are used, there is no >> need to use JTA. Is that correct?? >> >> 4. Only in J2SE environments, we can use EntityTransaction object. is >> that correct?? >> > > Hopefully the above explanation answers these questions (good questions, > BTW). If anything is still unclear, definitely don't hesitate to ask for > more information or for something to be simply reworded (can be hard trying > to find the right way to explain these things). > > > -David > > > On 5/28/08, David Jencks <[EMAIL PROTECTED]> wrote: >> >>> 1. I hope you named the file openejb-jar.xml >>> 2. jta-datasource and non-jta-datasource have to contain the names of >>> the datasources in the geronimo plan used for the pool, NOT some jndi >>> name you might also map them to. The datasources don't need to be >>> bound in jndi in order to be used for jpa >>> 3. The non-jta-datasource must be a datasource that really has no >>> transaction support, using the <no-transaction/> element instead of >>> <local-transaction/> or <xa-transaction>... in the connector plan. >>> With derby I find it necessary to have a non-jta-datasource if any ddl >>> is needed or if openjpa is generating the primary keys. I don't know >>> if you can get away without one for other databases. If you want to >>> experiment, leave out the non-jta-datasource rather than duplicating >>> the jta-datasource contents. >>> >>> hope this helps >>> david jencks >>> >>> On May 27, 2008, at 4:09 PM, zeros wrote: >>> >>> >>>> Good evening: >>>> >>>> I'm newbie with EJB3.0. I want to configure the persistence.xml >>>> to have >>>> entities managed with JPA. I have the next configuration files: >>>> OPENJPA-JAR.XML >>>> >>>> <openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1" >>>> xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.1" >>>> xmlns:pkgen="http://www.openejb.org/xml/ns/pkgen-2.0" >>>> xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.1" >>>> xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2"> >>>> <sys:environment> >>>> <sys:moduleId> >>>> <sys:groupId>o2o.marketing</sys:groupId> >>>> <sys:artifactId>EJB</sys:artifactId> >>>> <sys:version>1.0.8</sys:version> >>>> <sys:type>jar</sys:type> >>>> </sys:moduleId> >>>> <sys:dependencies> >>>> <sys:dependency> >>>> <sys:groupId>console.dbpool</sys:groupId> >>>> <sys:artifactId>marketing</sys:artifactId> >>>> <sys:version>1.0</sys:version> >>>> <sys:type>rar</sys:type> >>>> </sys:dependency> >>>> </sys:dependencies> >>>> </sys:environment> >>>> </openejb-jar> >>>> >>>> And I have also persistence.xml >>>> >>>> <?xml version="1.0" encoding="UTF-8"?> >>>> <persistence version="1.0" xmlns=" >>>> http://java.sun.com/xml/ns/persistence >>>> " >>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence >>>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> >>>> <persistence-unit name="marketing"> >>>> <description>Entity Beans for User</description> >>>> >>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</ >>>> provider> >>>> <jta-data-source>java:comp/env/marketing</jta-data-source> >>>> >>>> <non-jta-data-source>java:comp/env/marketing</non-jta-data-source> >>>> <mapping-file>META-INF/orm.xml</mapping-file> >>>> <properties /> >>>> </persistence-unit> >>>> </persistence> >>>> >>>> The error which I'm having is the next one: Unable to resolve >>>> reference >>>> "JtaDataSourceWrapper" and Unable to resolve reference >>>> "NonJtaDataSourceWrapper", which are basically the same error. >>>> >>>> I think this is produced because I'm not mapping the Datasocurce to >>>> the >>>> DBPool. Geronimo returns to me examples to do it for web, but no >>>> example to >>>> do it for an EJB. >>>> >>>> Please could you help me? >>>> >>>> WATCH OUT! I'm talking about entities and EJB3.0, not entiti beans and >>>> EJB2.0 >>>> >>>> Thanks in advance >>>> >>>> SERGIO >>>> -- >>>> View this message in context: >>>> >>>> http://www.nabble.com/JPA%2C-entities-and-EJB3-tp17502079s134p17502079.html >>>> Sent from the Apache Geronimo - Users mailing list archive at >>>> Nabble.com. >>>> >>>> >>> >>> >> >