geronimo-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Phani Madgula" <phanibalaji.madg...@gmail.com>
Subject Re: JPA, entities and EJB3
Date Mon, 09 Jun 2008 08:43:57 GMT
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.
***********
<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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"
version="1.0">

    <!-- Tutorial "unit" -->
    <persistence-unit name="Tutorial" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <non-jta-data-source>ProductDS-nonJTA</non-jta-data-source>
    <mapping-file>orm.xml</mapping-file>
    <class>samples.jpa.Product</class>
    <class>samples.jpa.Book</class>

    </persistence-unit>
	
</persistence>

***********

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();
			
			//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);
		}
***********************

1. When I hit the servlet, I get the following error.

   ***********************
   javax.persistence.TransactionRequiredException : No Active transaction
   ***********************

2. Suppose I have the following code in the servlet
    **********************
***********
@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

  *************************

3. Only if I use JTA API, I am able to get the entity persisted
properly as below.
 ***************************
@PersistenceContext(unitName="Tutorial")
   private EntityManager em;
.....
....
		UserTransaction ut;
		try{
			Context ctx = new InitialContext();
			
			ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
			ut.begin();
			
			
			Book book = new Book("DDDDD","John",1.0,"Joe","1934834-23823","Phani");
			em.persist(book);


			ut.commit();
			
		}catch(Exception e){
			e.printStackTrace();
			throw new ServletException (e);
		}
****************************

Please note that I am using "RESOURCE_LOCAL" persistence unit. I also
used <non-jta-datasource>. I deployed the database pool with
</no-transaction> tag in the connector deployment plan.

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

Thanks in advance.
Phani

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

Mime
View raw message