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



Reply via email to