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.
>>>>
>>>>
>>>
>>>
>>
>