geronimo-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Petersson <pe...@pmb.mine.nu>
Subject Re: Web app with jpa -- configuration help needed
Date Fri, 15 Jun 2007 23:17:46 GMT
Thank you both!

I was actually looking up the EMF to try to create the EM but could not 
get throw the configuration although I have tried a lot of stuff . I 
have not been able to look in to your suggestions yet but it looks 
promising and getting rid of some of the configuration would be nice ;). 
I will probably get back to you, btw what about the location of the 
persistence.xlm file should I drop it in 
webapp/WEB-INF/classes/META-INF/ instead of webapp/META-INF/ ?

Yes I have been looking at the jpa sample in the testsuite 
(enterprise-testsuite/jpa-tests/...) but that is a EAR configuration and 
the jpa-war part is looking up things via a ejb context so I am not sure 
it helps configuration vise (?)

/Peter Petersson


Jay D. McHugh wrote:
> David is correct about being able to look up an EntityManager in JNDI.
>
> As long as you do not try to cache the EntityManager in an instance 
> variable, you should not have a problem.
>
> There was an earlier problem with injecting UserTransactions that also 
> made it so that I was not able to directly use EntityManagers - it has 
> been fixed (today is the first time that I have tried it so I don't 
> know how long it has been fixed).
>
> I have been working with the setup I described previously - but it 
> looks like all of the problems that prevented me from setting this up 
> 'correctly' have been fixed.
>
> (You will need to inject a UserTransaction resource to be able to 
> commit database changes)
>
> I have begun reworking my app to use my configured database pool and 
> JNDI to lookup the EntityManager.
>
> If you need/want further help, let me know - I should have my whole 
> app converted by some time Monday.
>
> Thanks David,
>
>
> Jay
>
> David Jencks wrote:
>> I'm not sure jays' info is correct.
>>
>> You can get an EntityManager in a servlet as long as you look it up 
>> in jndi, just don't inject it using annotations or cache it in a 
>> field in your servlet.
>>
>> I think the problem is that you are looking up 
>> java:comp/env/jdbc/jBasicDB which is where the datasource is expected 
>> to be, not the EntityManager.  Also in your geronimo plan you have a 
>> persistence-unit-ref specified but you want a persistence-context-ref 
>> since you are looking for an EntityManager, not an EntityManagerFactory.
>>
>> I would suggest that you look up java:comp/env/jBasicDB in your 
>> servlet, and include this in your web.xml and then you won't need 
>> anything in your geronimo-web plan:
>>
>> <persistence-context-ref>
>>     
>> <persistence-context-ref-name>jBasicDB</persistence-context-ref-name>
>>     <!-- I can't remember if anything else is required -->
>> </persistence-context-ref>
>>
>> Also I strongly recommend including a non-jta-datasource in the 
>> persistence.xml, I haven't been able to get anything to work with 
>> derby without that.  mysql may be more forgiving/less prone to weird 
>> deadlocks.  Leave out all the connect-to-mysql parameters in 
>> persistence.xml and use the datasource.
>>
>> You don't need a resource-ref anywhere if you aren't using the db 
>> directly from your servlet.
>>
>> I assume you've found the jpa sample under testsuite/.....? It uses 
>> derby but does show a (usually) working configuration.
>>
>> Hope this helps
>> david jencks
>>
>> On Jun 15, 2007, at 12:20 PM, Jay D. McHugh wrote:
>>
>>> Peter,
>>>
>>> I just realized - if you are doing resource_local access, you don't 
>>> actually need the database pool.
>>>
>>> OpenJPA will create connections as it needs them.
>>>
>>> I would leave the database pool there though - it doesn't hurt 
>>> anyone having it there.
>>>
>>> Once you manage to get your app deployed, take a look in the jmx 
>>> viewer of the admin console under J2EE Managed Objects/Persistence 
>>> Unit to make sure it got deployed correctly.  Also, when you deploy, 
>>> there will be a message dumped to the log about a property being 
>>> unrecognized - you can ignore it.  It is an issue with OpenJPA that 
>>> already has a JIRA filed for it.
>>>
>>> Make sure you have the synchronizeMappings property set in your 
>>> persistence.xml - otherwise the Geronimo default will kick in and 
>>> try to recreate your tables and destroy all of your data.
>>>
>>> If I have time to try fixing my app to use the jta datasource - I'll 
>>> let you know what needs to change.
>>>
>>>
>>> Jay
>>>
>>> Jay D. McHugh wrote:
>>>> Hi Peter,
>>>>
>>>> In a webapp, you are not allowed to directly get an EntityManager 
>>>> (they aren't threadsafe).  Instead, you need to get an 
>>>> EntityManagerFactory.
>>>>
>>>> I was originally not able to get access to a jta-datasource, I had 
>>>> to go with resource-local.  I never went back to try accessing a 
>>>> database pool - so I'm going to tell you how I got things working 
>>>> in my current setup (using your values).
>>>>
>>>> _persistence.xml
>>>>
>>>> _<?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" version="1.0"
>>>>    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
>>>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
>>>>    <persistence-unit transaction-type="RESOURCE_LOCAL" 
>>>> name="jbasicDB">
>>>>        
>>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

>>>>
>>>>        <class>nu.m4u.jbasic.control.jpa.Users</class>
>>>>        <exclude-unlisted-classes />
>>>>        <properties>
>>>>            <property name="openjpa.ConnectionURL" 
>>>> value="jdbc:mysql://localhost:3306/jbasic"/>
>>>>            <property name="openjpa.ConnectionDriverName" 
>>>> value="com.mysql.jdbc.Driver"/>
>>>>            <property name="openjpa.ConnectionUserName" value="xxxxx"/>
>>>>            <property name="openjpa.ConnectionPassword" value="xxxxx"/>
>>>>            <property name="openjpa.Log" value="DefaultLevel=WARN, 
>>>> Tool=INFO"/>
>>>>            <property name="openjpa.jdbc.DBDictionary" 
>>>> value="mysql(SupportsSubselect=true)" />
>>>>            <property name="openjpa.Log" value="DefaultLevel=INFO" />
>>>>            <property name="openjpa.AutoDetach" value="close" />
>>>>            <property name="openjpa.DetachState" value="all" />
>>>>            <property name="openjpa.DataCache" value="false" />
>>>>            <property name="openjpa.Optimistic" value="true" />
>>>>            <property name="openjpa.Multithreaded" value="true" />
>>>>            <property name="openjpa.TransactionMode" value="local" />
>>>>            <property name="openjpa.NontransactionalRead" 
>>>> value="true" />
>>>>            <property name="openjpa.RestoreState" value="all" />
>>>>            <property name="openjpa.jdbc.SynchronizeMappings" 
>>>> value="false" />
>>>>        </properties>
>>>>    </persistence-unit>
>>>> </persistence>
>>>>
>>>> _geronimo-web.xml:_
>>>>
>>>> Remove all of the persistence unit info ->
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2"
>>>>        xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.1"
>>>>        xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.1"
>>>>        xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1">
>>>> <sys:environment>
>>>>   <sys:moduleId>
>>>>     <sys:groupId>jbasic</sys:groupId>
>>>>     <sys:artifactId>jbasic2</sys:artifactId>
>>>>     <sys:type>war</sys:type>
>>>>   </sys:moduleId>
>>>>   <sys:dependencies>
>>>>     <sys:dependency>
>>>>        <sys:groupId>console.dbpool</sys:groupId>
>>>>        <sys:artifactId>jbasicDB</sys:artifactId>
>>>>        <sys:version>1.0</sys:version>
>>>>        <sys:type>rar</sys:type>
>>>>     </sys:dependency>         <sys:dependency>
>>>>       <sys:groupId>mysql</sys:groupId>
>>>>       <sys:artifactId>mysql-connector-java</sys:artifactId>
>>>>       <sys:version>3.1.12</sys:version>
>>>>       <sys:type>jar</sys:type>
>>>>        </sys:dependency>
>>>> </sys:dependencies>
>>>> </sys:environment>
>>>> <context-root>/jbasic2</context-root>
>>>> </web-app>
>>>>
>>>> _web.xml:_
>>>>
>>>> Remove the peristence info.
>>>>
>>>> _database pool plan:_
>>>>
>>>> looks fine
>>>>
>>>>
>>>> Then, in order to get an EntityManagerFactory in your servlets use 
>>>> resource injection to create a class variable:
>>>>
>>>>    @PersistenceUnit(unitName="jbasicDB") private 
>>>> EntityManagerFactory emf;
>>>>
>>>> And finally, wherever you need access to an EntityManager:
>>>>
>>>> EntityManager em = emf.createEntityManager();
>>>>
>>>> em.getTransaction().begin();
>>>>
>>>> // do stuff
>>>>
>>>> em.getTransaction().commit();
>>>>
>>>> em.close();
>>>>
>>>> If you are only reading from your database, you can leave off the 
>>>> 'em.getTransaction()' stuff.  But if you are modifying data - you 
>>>> will need these otherwise, when you close your EntityManager 
>>>> instances all of your changes go away.
>>>>
>>>> Hope this helps,
>>>>
>>>>
>>>> Jay
>>>>
>>>> Peter Petersson wrote:
>>>>> Hi
>>>>>
>>>>> Need help on resolving the following configuration problem.
>>>>> I am trying to find out how to get a geronimo database pool 
>>>>> (mysql) used in a webapp, JPA managed in G v2.0 M6 (this is just a 
>>>>> WAR not a EAR).
>>>>>
>>>>> I end up stuck at deployment with the following error message.
>>>>>
>>>>> 13:42:42,291 ERROR [Deployer] Deployment failed due to
>>>>> org.apache.geronimo.common.DeploymentException: At least one 
>>>>> deployment 
>>>>> problem:[org.apache.geronimo.common.DeploymentException: Could not 
>>>>> resolve reference at deploy time for query 
>>>>> ?name=jbasicDB#org.apache.geronimo.persistence.PersistenceUnitGBean.

>>>>> No GBean references found.]
>>>>>        at 
>>>>> org.apache.geronimo.persistence.builder.PersistenceUnitRefBuilder.buildNaming(PersistenceUnitRefBuilder.java:154)

>>>>>
>>>>>        at 
>>>>> org.apache.geronimo.persistence.builder.PersistenceUnitRefBuilder$$FastClassByCGLIB$$9679ec9.invoke(<generated>)

>>>>>
>>>>>
>>>>> I have looked around for G/JPA configuration information but the 
>>>>> ones I have found aether deals with G:s derby db (examples working 
>>>>> fine) or is a fully fledged EAR application which is a bit of an 
>>>>> overkill as this app is meant to be used as a educational 
>>>>> "stepping stone" app for some colleagues ( and me as it seems ;) ).
>>>>>
>>>>> I'm trying to get hold of the entity manager with the following 
>>>>> JNDI context lookup name "java:comp/env/jdbc/jbasicDB"
>>>>>
>>>>> Here is relevant (or not so) parts of the current incarnation of 
>>>>> the configuration:
>>>>>
>>>>> persistency.xml (in webapp/WEB-INF)
>>>>> ------------------------------------------------
>>>>> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
>>>>>             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>>>             version="1.0"
>>>>>             
>>>>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
>>>>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
>>>>>
>>>>>  <persistence-unit name="jbasicDB" transaction-type="JTA">
>>>>>   
>>>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

>>>>>
>>>>>   <jta-data-source>jdbc/jbasicDB</jta-data-source>
>>>>>   <class>nu.m4u.jbasic.control.jpa.Users</class>
>>>>>   <exclude-unlisted-classes/>
>>>>>    <properties>
>>>>>     <property name="openjpa.jdbc.DBDictionary" 
>>>>> value="org.apache.openjpa.jdbc.sql.MySQLDictionary"/>
>>>>>      <property name="openjpa.ConnectionURL" 
>>>>> value="jdbc:mysql://localhost:3306/jbasic"/>
>>>>>      <property name="openjpa.ConnectionDriverName" 
>>>>> value="com.mysql.jdbc.Driver"/>
>>>>>      <property name="openjpa.ConnectionUserName" value="xxxxx"/>
>>>>>      <property name="openjpa.ConnectionPassword" value="xxxxx"/>
>>>>>      <property name="openjpa.Log" value="DefaultLevel=WARN, 
>>>>> Tool=INFO"/>
>>>>>    </properties>    </persistence-unit>
>>>>> </persistence>
>>>>> ------------------------------------------------
>>>>>
>>>>> geronimo-web.xml
>>>>> ------------------------------------------------
>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2"
>>>>>         xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.1"
>>>>>         xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.1"
>>>>>         xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1">
>>>>>  <sys:environment>
>>>>>    <sys:moduleId>
>>>>>      <sys:groupId>jbasic</sys:groupId>
>>>>>      <sys:artifactId>jbasic2</sys:artifactId>
>>>>>      <sys:type>war</sys:type>
>>>>>    </sys:moduleId>
>>>>>    <sys:dependencies>
>>>>>      <sys:dependency>
>>>>>         <sys:groupId>console.dbpool</sys:groupId>
>>>>>         <sys:artifactId>jbasicDB</sys:artifactId>
>>>>>         <sys:version>1.0</sys:version>
>>>>>         <sys:type>rar</sys:type>
>>>>>      </sys:dependency>         <sys:dependency>
>>>>>        <sys:groupId>mysql</sys:groupId>
>>>>>        <sys:artifactId>mysql-connector-java</sys:artifactId>
>>>>>        <sys:version>3.1.12</sys:version>
>>>>>        <sys:type>jar</sys:type>        </sys:dependency>
>>>>>      <!--        <sys:dependency>
>>>>>         <sys:groupId>org.apache.geronimo.configs</sys:groupId>
>>>>>         <sys:artifactId>openjpa</sys:artifactId>
>>>>>         <sys:type>car</sys:type>
>>>>>      </sys:dependency>
>>>>>      -->            </sys:dependencies>       </sys:environment>
>>>>>
>>>>>  <context-root>/jbasic2</context-root>
>>>>>
>>>>>  <persistence-unit-ref>
>>>>>     
>>>>> <persistence-unit-ref-name>jdbc/jbasicDB</persistence-unit-ref-name>
>>>>>     <persistence-unit-name>jbasicDB</persistence-unit-name>
>>>>>  </persistence-unit-ref>
>>>>>
>>>>> <!--        <sys:resource-ref>
>>>>>     <sys:ref-name>jdbc/jbasicDB</sys:ref-name>
>>>>>     <sys:resource-link>jbasicDB</sys:resource-link>
>>>>>  </sys:resource-ref>
>>>>> -->  </web-app>   ------------------------------------------------
>>>>>
>>>>> web.xml
>>>>> ------------------------------------------------
>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>> <web-app id="WebApp_ID" version="2.4"
>>>>>    xmlns="http://java.sun.com/xml/ns/j2ee"
>>>>>    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>>>    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
>>>>> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
>>>>>    <!-- Nothing much here yet -->    <!--         <resource-ref>
>>>>>        <res-ref-name>jdbc/jbasicDB</res-ref-name>
>>>>>        <res-type>javax.sql.DataSource</res-type>
>>>>>        <res-auth>Container</res-auth>
>>>>>        <res-sharing-scope>Shareable</res-sharing-scope>
>>>>>    </resource-ref>    -->          </web-app>    
>>>>> ------------------------------------------------
>>>>>
>>>>> database pool plan
>>>>> ------------------------------------------------
>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>> <connector 
>>>>> xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2">
>>>>>    <dep:environment 
>>>>> xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2">
>>>>>        <dep:moduleId>
>>>>>            <dep:groupId>console.dbpool</dep:groupId>
>>>>>            <dep:artifactId>jbasicDB</dep:artifactId>
>>>>>            <dep:version>1.0</dep:version>
>>>>>            <dep:type>rar</dep:type>
>>>>>        </dep:moduleId>
>>>>>        <dep:dependencies>
>>>>>            <dep:dependency>
>>>>>                <dep:groupId>mysql</dep:groupId>
>>>>>                <dep:artifactId>mysql-connector-java</dep:artifactId>
>>>>>                <dep:version>3.1.12</dep:version>
>>>>>                <dep:type>jar</dep:type>
>>>>>            </dep:dependency>
>>>>>        </dep:dependencies>
>>>>>    </dep:environment>
>>>>>    <resourceadapter>
>>>>>        <outbound-resourceadapter>
>>>>>            <connection-definition>
>>>>>                
>>>>> <connectionfactory-interface>javax.sql.DataSource</connectionfactory-interface>

>>>>>
>>>>>                <connectiondefinition-instance>
>>>>>                    <name>jbasicDB</name>
>>>>>                    <config-property-setting 
>>>>> name="Password">xxxx</config-property-setting>
>>>>>                    <config-property-setting 
>>>>> name="Driver">com.mysql.jdbc.Driver</config-property-setting>
>>>>>                    <config-property-setting 
>>>>> name="UserName">xxxx</config-property-setting>
>>>>>                    <config-property-setting 
>>>>> name="ConnectionURL">jdbc:mysql://localhost:3306/jbasic</config-property-setting>

>>>>>
>>>>>                    <connectionmanager>
>>>>>                        <local-transaction/>
>>>>>                        <single-pool>
>>>>>                            <max-size>10</max-size>
>>>>>                            <min-size>0</min-size>
>>>>>                            <match-one/>
>>>>>                        </single-pool>
>>>>>                    </connectionmanager>
>>>>>                </connectiondefinition-instance>
>>>>>            </connection-definition>
>>>>>        </outbound-resourceadapter>
>>>>>    </resourceadapter>
>>>>> </connector>
>>>>> ------------------------------------------------
>>>>>
>>>>> Anny help is appreciated !
>>>>> /Peter Petersson
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>
>>
>>
>>


Mime
View raw message