4 Replies Latest reply on May 4, 2008 3:14 PM by Michael O'Brien

    PersistenceUnitInfo

    William Conroy Newbie

      I was trying to integrate the Glassfish's Toplink entity manager into jboss and I am running into some problems. There is an exception being thrown by the glassfish entity manager when it makes a call to

      PersistenceUnitInfo.getNewTempClassLoader();

      The jboss implementation (org.jboss.ejb3.entity.PersistenceUnitInfoImpl) returns null. Is there any reason for this? Is there any plan to implement this method in the near future? Is there a way to override the implementation of the persistence unit info myself?

      Thanks,

      Bo

        • 1. Re: PersistenceUnitInfo
          William Conroy Newbie

          Is there any word on this?

          • 3. Re: PersistenceUnitInfo
            Michael O'Brien Newbie

            Hi, There is a fix for the secondary NPE in this bug within EclipseLink M7 under bug#227630

            This is a fix for the NPE when doing a universalClassLoader3.loadClass() - the call to aPersistenceUnitInfo.getNewTempClassLoader() returns a [UCL3] not [null] in this case.

            The JBoss SPI implementation for persistenceUnitInfo.getNewTempClassLoader() is causing a NPE problem when using the JBoss4 UniversalClassLoader3 - returning [null] for UCL3.loadClass(entity).
            A secondary NPE occurs in EclipseLink when trying to use this [null] missing entity class. The workaround is to handle the original NPE and disable weaving for the session.

            See
            https://bugs.eclipse.org/227630
            https://bugs.eclipse.org/bugs/attachment.cgi?id=96619&action=diff

            Thank you for raising this issue.
            /michael

            • 4. Re: PersistenceUnitInfo
              Michael O'Brien Newbie

              Hi,
              The following workaround has been checked in for EclipseLink M8 to work with JBoss 4.2.2 GA.
              Container managed entities should predeploy/deploy and register now with/without static weaving.
              When the UCL3 classLoader no longer causes a NPE (See JIRA http://jira.jboss.com/jira/browse/EJBTHREE-572 ) we will reenable dynamic weaving on EAR predeploy().

              http://bugs.eclipse.org/229634

              Workaround:
              ---------------------------------
              EclipseLink will use the non-temporary classLoader instead of the one from getNewTempClassLoader() obtained from the JBoss PersistenceUnitInfo that throws a NPE on loadClass() or Class.forName().
              We require that JBoss implementers statically weave container managed entities and reference JBoss as the target-server in persistence.xml.

              Deployment Changes:
              1) If weaving is required then static weave the entities before EAR packaging using either the command-line weaver or the weaving ant task.
              2) All persistence units deployed to the JBoss container must contain the following property in persistence.xml or container managed entities will predeploy but fail to be managed at runtime.



              JBoss AS 4.2.2 GA debugging:
              ----------------------------------------------------------
              I debugged the UCL3 NullPointerException into the JBoss AS 4.2.2 GA source into the following segment of code.

              In the following function the classloader parent tree is searched all the way to the root.
              no clazz is returned and in the finally clause the last log.trace causes a RuntimeException on a NPE.
              Curious though that the line number in Logger.trace() does not correspond to the JDK 1.5 src.

              package org.jboss.mx.loading
              public abstract class RepositoryClassLoader extends URLClassLoader
              public Class loadClass(String name, boolean resolve)
              throws ClassNotFoundException
              ...
              finally
              ...
              --->NPE log.trace("loadClass " + this + " name=" + name + " not found");
              }
              }
              }

              Thread [main] (Suspended)
              UnifiedClassLoader3(RepositoryClassLoader).loadClass(String, boolean) line: 425
              UnifiedClassLoader3(ClassLoader).loadClass(String) line: 251
              UnifiedClassLoader3(ClassLoader).loadClassInternal(String) line: 319
              Class.forName0(String, boolean, ClassLoader) line: not available [native method]
              Class.forName(String, boolean, ClassLoader) line: 242
              PrivilegedAccessHelper.getClassForName(String, boolean, ClassLoader) line: 85
              XMLEntityMappings.getClassForName(String, ClassLoader) line: 120
              XMLEntityMappings.getClassForName(String) line: 157
              XMLEntityMappings.initPersistenceUnitClasses() line: 389
              MetadataProcessor.initPersistenceUnitClasses() line: 188
              MetadataProcessor.processEntityMappings() line: 298

              Results:
              --------
              15:41:43,772 INFO [STDOUT] [EPS Warning]: 2008.05.02 15:41:43.755--Thread(Thread[main,5,jboss])--The temporary classLoader for PersistenceLoadProcessor [helloworld] is not available. Switching classLoader to [org.jboss.mx.loading.UnifiedClassLoader3@18b995c{ url=file:/C:/opt/jboss422/server/default/tmp/deploy/tmp13465jsfejb3.ear ,addedOrder=45}]. Weaving has been disabled for this session. EclipseLink may be unable to get a spec mandated temporary class loader from the server, you may be able to use static weaving as an optional workaround.
              15:41:44,221 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:ear=jsfejb3.ear,jar=app.jar,name=TodoDao,service=EJB3 with dependencies:
              15:41:44,221 INFO [JmxKernelAbstraction] persistence.units:ear=jsfejb3.ear,jar=app.jar,unitName=helloworld
              15:41:44,359 INFO [EJBContainer] STARTED EJB: TodoDao ejbName: TodoDao
              15:42:45,344 INFO [STDOUT] [EPS Finer]: 2008.05.02 15:42:45.343--UnitOfWork(20862427)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--TX binding to tx mgr, status=STATUS_ACTIVE
              15:42:45,344 INFO [STDOUT] [EPS Finest]: 2008.05.02 15:42:45.344--UnitOfWork(20862427)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--Execute query DoesExistQuery()
              15:42:45,350 INFO [STDOUT] [EPS Finest]: 2008.05.02 15:42:45.350--UnitOfWork(20862427)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--PERSIST operation called on: Todo@15914f3.

              thank you
              /michael