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 <david.blevins@visi.com> 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 <david_jencks@yahoo.com> 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.