persistence@glassfish.java.net

Re: EntityManager lookup difference between GF V2 and V3

From: Mitesh Meswani <Mitesh.Meswani_at_Sun.COM>
Date: Fri, 25 Sep 2009 13:12:08 -0700
I am surprised that it worked in V2. You should be specifying jta-data-source instead of non-jta-data-source in persitence.xml. Somethig like as follows
  <persistence-unit name="org.webonweb.runtime.impl.repository.db" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/webonweb/repository</non-jta-data-source>
   
<jta-data-source>jdbc/webonweb/repository</jta-data-source>

Thanks,
Mitesh

Girish Kumar Balachandran wrote:
Hi There,
We are trying out GF v3 for zembly.com and I am seeing following exception in obtaining EntityManager for EntityManagerFactory (em = emf.createEntityManager();):

Caused by: Exception [EclipseLink-4021] (Eclipse Persistence Services - 1.0.1 (Build 20080905)): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Unable to acquire a connection from driver [null], user [null] and URL [null].  Verify that you have set the expected driver class and URL.  Check your login, persistence.xml or sessions.xml resource.  The jdbc.driver property should be set to a class that is compatible with your database platform
        at org.eclipse.persistence.exceptions.DatabaseException.unableToAcquireConnectionFromDriverException(DatabaseException.java:365)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:90)


Things work perfect with GF V2/2.1 but, V3 does not seem to work. Am I supposed to do something more than the following?

Any tips would be much appreciated.

Thanks,
=Girish

These are the configuration I have:

System servlet has these 2 annotations reg PU:


@PersistenceUnits(
    {
        @PersistenceUnit(name = "webonweb/repositoryEntityManagerFactory",
                         unitName = "org.webonweb.runtime.impl.repository.db"),
        @PersistenceUnit(name = "webonweb/readOnlyRepositoryEntityManagerFactory",
                         unitName = "org.webonweb.runtime.impl.repository.db.readonly")
    }
)



Persistence.xml has (use introspection to discover all entities):

  <persistence-unit name="org.webonweb.runtime.impl.repository.db" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/webonweb/repository</non-jta-data-source>
    <properties>
      <!-- <property name="toplink.logging.level" value="FINE"/> -->
      <!-- property name="toplink.logging.logger" value="JavaLogger"/ -->
      <!-- END JPA cache control properties -->
      <property name="eclipselink.cache.shared.default" value="true"/>
      <property name="eclipselink.logging.level" value="OFF"/>
    </properties>
  </persistence-unit>
  <persistence-unit name="org.webonweb.runtime.impl.repository.db.readonly" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/webonweb/readonlyrepository</non-jta-data-source>
    <properties>
      <property name="eclipselink.cache.shared.default" value="true"/>
      <property name="eclipselink.logging.level" value="OFF"/>
    </properties>
  </persistence-unit>

EMF was obtained by (got EMF with out any exception):

    protected EntityManagerFactory createEntityManagerFactory() throws RepositoryException {
        try {
            InitialContext ic = new InitialContext();
            return (EntityManagerFactory) ic.lookup("java:comp/env/webonweb/repositoryEntityManagerFactory");
        } catch (NamingException ne) {
            throw new RepositoryException(ne);
        }
    }
   
    protected EntityManagerFactory createReadOnlyEntityManagerFactory() throws RepositoryException {
        try {
            InitialContext ic = new InitialContext();
            return (EntityManagerFactory) ic.lookup("java:comp/env/webonweb/readOnlyRepositoryEntityManagerFactory");
        } catch (NamingException ne) {
            throw new RepositoryException(ne);
        }
    }


Made sure that the data source is getting looked up correctly by the following code - hence not a config problem:

    private Connection getConnection() throws RepositoryException, SQLException {
        try {
            InitialContext ic = new InitialContext();
            DataSource sd = (DataSource) ic.lookup("java:comp/env/jdbc/webonweb/repository");
            return sd.getConnection();
        } catch (NamingException ne) {
            throw new RepositoryException(ne);
        }
    }


Version:  Eclipse Persistence Services - 1.0.1 (Build 20080905)
GF: GlassFish v3 Prelude (build b28f)