Thanks, Jim!

We asked another user the same time we asked you and they also reported no luck in getting EclipseLink to work deployed under the WEB- INF/lib.

This sounds like something a lot of people would waste a lot of time on. At minimum we can add an EclipseLink page to our documentation and mention this restriction.

Looking at the EclipseLink doc it seems they have a restriction about splitting the eclipselink jar from the jar that contains the javax.persistence libraries. Since we have that library in our javaee- api jar which effectively gets added to Tomcat/lib that explains why EclipseLink doesn't work in the WEB-INF/lib/ directory.

  
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#EclipseLink_JAR_location

The doc doesn't explain *why* EclipseLink has such a strange limitation. I've not heard of any other JPA provider with the same limitation.

If you get around to asking them, definitely post a link to the thread. My curiosity is definitely peaked.

-David

On Aug 30, 2009, at 1:30 PM, JimOR wrote:


David,

Apologies for the late follow-up, not sure how I missed your second reply
from the 17th...


David Blevins wrote:

Hey Jim,

Wonder if this might be your situation too:


http://www.nabble.com/rg.apache.openejb.OpenEJBException%3A-Unable-to-determine-the-module-type-of-tp24921373p25013439.html

See my followup and mod the "EMFProvider" class you have and have it
do the getResources() check I mention there.

That may help us narrow down your issue.


My getResources() call shows a single jar. But I played around with various
combinations of deploying EclipseLink under WEB-INF/lib and under
Tomcat/endorsed.

The only 'clean' initialization was with the Eclipselink API and Impl jars
at Tomcat's level.

I put clean in quotes because there seems to be a Log4j classloading issue. (I have 1.2.15 deployed to Tomcat, openejb webapp lib has 1.2.12) I seem to recall a Tomcat classloader configuration adjustment that might address this, and everybody(webapp, Eclipselink, OpenEJB) happily logs, but here's
what got spit out:

[2009-08-30 12:54:00.812] INFO-
org.apache.openejb.util.Log4jLogStream.info(Line:70) - Assembling app:
C:\EclipseGalileoBase\.metadata\.plugins\org.eclipse.wst.server.core \tmp0\wtpwebapps\sample
[2009-08-30 12:54:00.828] INFO-
org.apache.openejb.util.Log4jLogStream.info(Line:70) -
PersistenceUnit(name=sample,
provider=org.eclipse.persistence.jpa.PersistenceProvider)
log4j:ERROR A "org.apache.log4j.xml.DOMConfigurator" object is not
assignable to a "org.apache.log4j.spi.Configurator" variable.
log4j:ERROR The class "org.apache.log4j.spi.Configurator" was loaded by log4j:ERROR [org.apache.openejb.core.tempclassloa...@11498ba] whereas object
of type
log4j:ERROR "org.apache.log4j.xml.DOMConfigurator" was loaded by [null].
log4j:ERROR Could not instantiate configurator
[org.apache.log4j.xml.DOMConfigurator].
[2009-08-30 12:54:01.484] INFO-
org.apache.openejb.util.Log4jLogStream.info(Line:70) - Deployed
Application(path=C:\EclipseGalileoBase\.metadata\.plugins \org.eclipse.wst.server.core\tmp0\wtpwebapps\sample)

Also, it seems that I must supply a <non-jta-data-source>. Running
stand-alone, I can provide persistence.xml <properties> or a map passed to createEntityManagerFactory() for JDBC connection information, but trying
that with OpenEJB embedded, I get:

SEVERE:
java.lang.UnsupportedOperationException: Not supported by BasicDataSource
        at
org .apache .commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:902)
        at
org .eclipse .persistence.sessions.JNDIConnector.connect(JNDIConnector.java:135)
        at
org .eclipse .persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
        at
org .eclipse .persistence .sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java: 162)
        at
org .eclipse .persistence .internal .sessions .DatabaseSessionImpl .loginAndDetectDatasource(DatabaseSessionImpl.java:583)
        at
org .eclipse .persistence .internal .jpa .EntityManagerFactoryProvider .login(EntityManagerFactoryProvider.java:227)
        at
org .eclipse .persistence .internal .jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:255)
        at
org .eclipse .persistence .internal .jpa .EntityManagerFactoryImpl .getServerSession(EntityManagerFactoryImpl.java:111)
        at
org .eclipse .persistence .internal .jpa .EntityManagerFactoryImpl .createEntityManagerImpl(EntityManagerFactoryImpl.java:163)
        at
org .eclipse .persistence .internal .jpa .EntityManagerFactoryImpl .createEntityManager(EntityManagerFactoryImpl.java:150)
        at pool.data.dao.impl.EMFProvider.getEM(EMFProvider.java:31)
        ...

Adding a <non-jta-data-source> element and resources to my Tomcat's
openejb.conf corrected that.


David Blevins wrote:


On a side note, that EMFProvider would make one great Singleton bean:

    import javax.ejb.Lock;
    import static javax.ejb.LockType.READ;
    import javax.ejb.Singleton;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.PersistenceUnit;


    @Singleton
    @Lock(READ)
    public class EMFProvider {

        @PersistenceUnit(unitName = "daosample")
        private EntityManagerFactory emf;

        public EntityManager getEM() {
            return getEMFactory().createEntityManager();
        }

        public EntityManagerFactory getEMFactory() {
            return emf;
        }
    }

The result is an bean which is scoped at the app level just as if it
was a static.  It's more thread safe -- the previous getEMFactory()
code could result in many EntityManagerFactory instances being
created.  You also no longer need to actively clean up the
EntityManagerFactory as the container will do that for you.



You're right.


--
View this message in context: 
http://www.nabble.com/Eclipselink-JPA-RESOURCE_LOCAL-PersistenceUnit-with-Tomcat-embedded-tp24746512p25215458.html
Sent from the OpenEJB User mailing list archive at Nabble.com.



Reply via email to