openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jody Grassel (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (OPENJPA-2227) OpenJPA doesn't find custom SequenceGenerators
Date Fri, 20 Jul 2012 21:27:33 GMT

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

Jody Grassel commented on OPENJPA-2227:
---------------------------------------

This problem doesn't show up in the JSE (which likely applies to JUnits) environment because
the application ClassLoader would be the ClassLoader responsible for loading both the OpenJPA
and JUnit/JSE application classes.  In a JEE environment, you have a hierarchy of ClassLoaders
- in the WebSphere case, OpenJPA would be loaded by one of the OSGi ClassLoaders, application
code lives in Application ClassLoaders which are children of the OSGi ClassLoaders.

When SequenceMetaData initializes, it attempts to perform a Class.forName() lookup for the
class denoted in the sequenceName entry.  However, it scopes the lookup to the ClassLoader
responsible for loading the OpenJPA classes, so it would never be able to check child ClassLoaders
for application-custom SequenceGenerators.

Curiously, the SequenceMetaData.instantiate() method takes a ClassLoader envLoader argument
(which, tracking back a couple frames in the stack trace, originates with a call to StoreContext.getClassloader()
-- which returns the Thread Context ClassLoader that was current when the StoreContext was
created.)  A modification to instantiate() to first perform the original Class.forName() lookup,
falling back to a Class.forName() lookup using envLoader if the first call results in a ClassNotFoundException
seems to resolve the issue in my test environment.
                
> OpenJPA doesn't find custom SequenceGenerators
> ----------------------------------------------
>
>                 Key: OPENJPA-2227
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2227
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.0.0, 2.1.0, 2.2.0
>         Environment: WebSphere Application Server V8.0 and V8.5
>            Reporter: Jens Leisenberg
>            Assignee: Jody Grassel
>            Priority: Blocker
>         Attachments: ClassNotFoundException.txt
>
>
> I'm trying to use a custom SequenceGenerator within an enterprise application using openJPA
(providing by WebSphere).
> When defining a custom Sequence a ClassNotFoundException (for the Sequence class) will
be thrown when trying to insert data into the database.
> ExampleConfiguration:
> {code}
> @Entity
> @SequenceGenerator(name="MySequence", sequenceName="org.apache.openjpa.generator.UIDGenerator()")
> public class Customer implements Serializable {
>     @Id
>     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="MySequence")
>     private long id;
> {code}
> The example will produce the stacktrace attached.
> It seems that the wrong class loader is used to instantiate the custom sequence class.
A very similar issue seems to be: OPENJPA-758. With JavaSE (JUnit) all is working fine, but
after deploying into WAS the Exception will occur.
> I think within the method SequenceMetaData.instantiate(Classloader envLoader) the JavaTypes.classForName()
-method with parameter mustExist=false should be used instead of the pure Class.forName()
call. But I'm not sure about the Metadata-parameter needed for this method call.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message