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 wrote: > > > On Jun 9, 2008, at 1:43 AM, Phani Madgula wrote: > > Hi, >> I have tried to play with and as >> follows. >> >> I have the following peristence.xml in a web application. >> > [...] > >> >> >> > [...] > > 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 >> or in JEE environment?? >> >> 2. How is the use of different from the use >> 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 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 element instead of >>> or ... 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 >>>> >>>> >>> 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"> >>>> >>>> >>>> o2o.marketing >>>> EJB >>>> 1.0.8 >>>> jar >>>> >>>> >>>> >>>> console.dbpool >>>> marketing >>>> 1.0 >>>> rar >>>> >>>> >>>> >>>> >>>> >>>> And I have also persistence.xml >>>> >>>> >>>> >>> 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"> >>>> >>>> Entity Beans for User >>>> >>>> org.apache.openjpa.persistence.PersistenceProviderImpl>>> provider> >>>> java:comp/env/marketing >>>> >>>> java:comp/env/marketing >>>> META-INF/orm.xml >>>> >>>> >>>> >>>> >>>> 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. >>>> >>>> >>> >>> >> >