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:09:35 GMT
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