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

Balazs Zsoldos commented on ARIES-681:
--------------------------------------

Hi,

I did not go into the source of EclipseLink but as much as I have seen till now 
the following happens:

There is are two entity classes and they are in one-to-many relationship. Due 
to this reason one of the classes has a property with the definition: 
Collection<Entity2>. At runtime I guess eclipselink thinks that a good 
implementation for this collection could be the IndirectList. So when it builds 
up the EntityManagerFactory and the metadata of the entity classes it uses 
IndirectList as the type of this property.

However when it comes to the part where it wants to get Class<?> objects out of 
the metadata it uses Class.forName(). That works good if the current 
classloader is the same as the one that loaded the current class so it works in 
ordinary webapps.

I could use the Glassfish supported way of persistence entity bundle (which I 
guess is not based on the OSGI 4.2 specification) however I would like to use 
aries blueprint as well other features from aries and I am not sure they would 
work with the Glassfish solution.

I would not like to add to my entity bundle "Import-Packages" eclipselink 
related classes as I would like to be JPA vendor independent. Of course 
EclipseLink could try to load the classes from its own bundle ClassLoader but I 
am afraid they do not think in OSGI that much so they will simply use 
Class.forName().

Due to the reason that JPA vendors use often CGLib and/or ASM to override 
property types in entity classes from their own classes (or proxy them or 
whatever) I thought it would have been useful to ask at least the bundle 
classloader of the provider when a class is searched (from Entity class 
property Types at runtime)...

With the patch I provided I successfully created a small application that has 
three bundles in Glassfish 3.1 (entity bundle, persistence service bundle, a 
web service bundle). If you can suggest any other workaround I would be happy 
to try it but for now I am not sure I can find anything else.

Regards,
Balazs

> JPA Container BundleDelegatingClassLoader should look for classes in the 
> provider bundle, too
> ---------------------------------------------------------------------------------------------
>
>                 Key: ARIES-681
>                 URL: https://issues.apache.org/jira/browse/ARIES-681
>             Project: Aries
>          Issue Type: Bug
>          Components: JPA
>    Affects Versions: 0.3
>         Environment: Glassfish 3.0 (EclipseLink 2.0.2), Glassfish 3.1 
> (EclipseLink 2.2)
>            Reporter: Balazs Zsoldos
>         Attachments: classloadingFromMultipleProviderDuringQuery.0.3.patch
>
>
> Currently the BundleDelegatingClassLoader in JPA container only looks for 
> classes in the bundle of the entitymanager. However the JPA implementation 
> Eclipselink needs some classes from itself. The reason is that in entity 
> classes the properties that hold mapping of One-To-Many are converted to 
> EclipseLink list type. See the following exception stacktrace:
> Internal Exception: java.lang.ClassNotFoundException: 
> org.eclipse.persistence.indirection.IndirectList
>       at 
> org.eclipse.persistence.exceptions.ValidationException.classNotFoundWhileConvertingClassNames(ValidationException.java:2317)
>       at 
> org.eclipse.persistence.internal.queries.InterfaceContainerPolicy.convertClassNamesToClasses(InterfaceContainerPolicy.java:123)
>       at 
> org.eclipse.persistence.mappings.CollectionMapping.convertClassNamesToClasses(CollectionMapping.java:788)
>       at 
> org.eclipse.persistence.descriptors.ClassDescriptor.convertClassNamesToClasses(ClassDescriptor.java:1458)
>       at 
> org.eclipse.persistence.sessions.Project.convertClassNamesToClasses(Project.java:362)
>       at 
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:322)
>       ... 83 more
> Caused by: java.lang.ClassNotFoundException: 
> org.eclipse.persistence.indirection.IndirectList
>       at 
> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:744)
>       at org.apache.felix.framework.ModuleImpl.access$100(ModuleImpl.java:61)
>       at 
> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1656)
>       at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
>       at 
> org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:604)
>       at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1487)
>       at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:897)
>       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.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(PrivilegedAccessHelper.java:88)
>       at 
> org.eclipse.persistence.internal.queries.InterfaceContainerPolicy.convertClassNamesToClasses(InterfaceContainerPolicy.java:120)
>       ... 87 more

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to