You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Bram Pouwelse (JIRA)" <ji...@apache.org> on 2012/10/16 19:55:02 UTC

[jira] [Commented] (OPENJPA-1346) ClassNotFoundException in org.apache.openjpa.datacache.Caches.addTypesByName

    [ https://issues.apache.org/jira/browse/OPENJPA-1346?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13477210#comment-13477210 ] 

Bram Pouwelse commented on OPENJPA-1346:
----------------------------------------

I'm experiencing the same problem in using OpenJPA in an OSGi container using multiple bundles containing a persistence context with DataCache enabled. 

bundle1
  EntityA
  persistence.xml: <property name="openjpa.DataCache" value="true(name=bundle1cache)" />

bundle2
  EntityB
  persistence.xml: <property name="openjpa.DataCache" value="true(name=bundle2cache)" />


When loading this into the OSGi container retrieving data works as expected but when modifying data a ClassNotFoundException is thrown:

Modifying EntityA:

java.lang.ClassNotFoundException: nl.ditp.fabuland.security.model.EntityA not found by bundle2
	at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
	at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
	at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	at org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)
	at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1654)
	at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:909)
	at org.apache.aries.jpa.container.unit.impl.BundleDelegatingClassLoader$1.run(BundleDelegatingClassLoader.java:50)
	at org.apache.aries.jpa.container.unit.impl.BundleDelegatingClassLoader$1.run(BundleDelegatingClassLoader.java:47)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.apache.aries.jpa.container.unit.impl.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:47)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at org.apache.openjpa.datacache.Caches.addTypesByName(Caches.java:44)

Modifying EntityA:

java.lang.ClassNotFoundException: nl.ditp.fabuland.security.model.EntityB not found by bundle1
.......
                
> ClassNotFoundException in org.apache.openjpa.datacache.Caches.addTypesByName
> ----------------------------------------------------------------------------
>
>                 Key: OPENJPA-1346
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1346
>             Project: OpenJPA
>          Issue Type: Question
>          Components: datacache
>    Affects Versions: 1.1.0
>         Environment: Windows / Oracle Weblogic 10.3.1 (JPA Version: <Starting OpenJPA 1.1.1-SNAPSHOT>)
>            Reporter: Niklas Mehner
>
> This seems to be the same problem as OPENJPA-1093 (only openjpa, not kodo)
> We are getting the following exception in our logfile:
> 5484  lvs-ejb3  WARN   [[ACTIVE] ExecuteThread: '12' for queue: 'weblogic.kernel.Default (self-tuning)'] openjpa.Runtime - null
> java.lang.ClassNotFoundException: de.evelopment.retail.lvs.ejb.stammdaten.BoxBean
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
>         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
>         at java.lang.Class.forName0(Native Method)
>         at java.lang.Class.forName(Class.java:247)
>         at org.apache.openjpa.datacache.Caches.addTypesByName(Caches.java:48)
>         at org.apache.openjpa.datacache.AbstractQueryCache.afterCommit(AbstractQueryCache.java:198)
>         at org.apache.openjpa.event.RemoteCommitEventManager.fireEvent(RemoteCommitEventManager.java:132)
>         at org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager.fireEvent(AbstractConcurrentEventManager.java:115)
>         at org.apache.openjpa.event.AbstractRemoteCommitProvider.fireEvent(AbstractRemoteCommitProvider.java:63)
>         at org.apache.openjpa.event.SingleJVMRemoteCommitProvider.broadcast(SingleJVMRemoteCommitProvider.java:58)
>         at org.apache.openjpa.event.RemoteCommitEventManager.afterCommit(RemoteCommitEventManager.java:156)
>         at org.apache.openjpa.event.TransactionEventManager.fireEvent(TransactionEventManager.java:107)
>         at org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager.fireEvent(AbstractConcurrentEventManager.java:115)
>         at org.apache.openjpa.kernel.BrokerImpl.fireTransactionEvent(BrokerImpl.java:757)
>         at org.apache.openjpa.kernel.BrokerImpl.endTransaction(BrokerImpl.java:2200)
>         at org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:1846)
>         at weblogic.transaction.internal.ServerSCInfo.doAfterCompletion(ServerSCInfo.java:1038)
>         at weblogic.transaction.internal.ServerSCInfo.callAfterCompletions(ServerSCInfo.java:1014)
>         at weblogic.transaction.internal.ServerTransactionImpl.callAfterCompletions(ServerTransactionImpl.java:2998)
>         at weblogic.transaction.internal.ServerTransactionImpl.afterCommittedStateHousekeeping(ServerTransactionImpl.java:2898)
>         at weblogic.transaction.internal.ServerTransactionImpl.setCommitted(ServerTransactionImpl.java:2943)
>         at weblogic.transaction.internal.ServerTransactionImpl.globalRetryCommit(ServerTransactionImpl.java:2733)
>         at weblogic.transaction.internal.ServerTransactionImpl.globalCommit(ServerTransactionImpl.java:2653)
>         at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:285)
>         at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:233)
>         at weblogic.ejb.container.internal.BaseRemoteObject.postInvoke1(BaseRemoteObject.java:621)
>         at weblogic.ejb.container.internal.StatelessRemoteObject.postInvoke1(StatelessRemoteObject.java:60)
>         at weblogic.ejb.container.internal.BaseRemoteObject.postInvokeTxRetry(BaseRemoteObject.java:441)
> where de.evelopment.retail.lvs.ejb.stammdaten.BoxBean is an entity bean. 
> I think the problem is that openjpa uses Class.forName(..) instead of Thread.currentThread().getContextClassLoader().loadClass(...) to load the class.
> openJPA is loaded by the system classloader, while the class is from the ear-classloader, so Class.forName(..) cannot work.
> the properties used in persistence.xml are:
>   <properties>
>      	<property name="openjpa.DetachState" value="fetch-groups(DetachedStateField=true)"/>
>      	<property name="openjpa.DataCache" value="true"/>
>         <property name="openjpa.RemoteCommitProvider" value="sjvm"/>     	
>      </properties>
> Can we ignore this problem or can this cause real problems (I do not care all that much if caching is not working for this class, but I don't want any data corruption)?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira