geronimo-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jay D. McHugh" <...@joyfulnoisewebdesign.com>
Subject Re: Web app with jpa -- configuration help needed
Date Fri, 15 Jun 2007 19:28:30 GMT
Peter,

I just noticed one (hopefully) final thing.

The location of your persistence.xml file needs to be:

WEB-INF/classes/META-INF/persistence.xml

At least that is where I had to put mine to get it working.  There has 
been a lot of work on getting persistence units to deploy since I put 
together my setup - so it may work with the persistence.xml where you 
already have it - check the persistence unit view to see.

Jay

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