I've committed an equivalent patch to 0.9.7 in SVN revision 522623.
Can you confirm whether this fixes your problem and, if so, close any
CR you might have opened on this?
This works for me :) Here's a patch for 0.9.6 source. I've gone for
the
simplest solution, but it might be improved by looping over pcNames
instead
of _registered (?).
http://www.nabble.com/file/7398/openjpa-diff openjpa-diff
Index: MetaDataRepository.java
===================================================================
--- MetaDataRepository.java
(.../tags/0.9.6/openjpa-kernel/src/main/java/org/apache/openjpa/meta)
(revision 3)
+++ MetaDataRepository.java
(.../branches/0.9.6-ninthavenue/openjpa-kernel/src/main/java/org/
apache/openjpa/meta)
(working copy)
@@ -302,7 +302,7 @@
return null;
// check cache
- processRegisteredClasses();
+ processRegisteredClasses(envLoader);
List classList = (List) _aliases.get(alias);
// multiple classes may have been defined with the same
alias: we
@@ -928,7 +928,7 @@
}
// check cache
- processRegisteredClasses();
+ processRegisteredClasses(envLoader);
Class cls = (Class) _oids.get(oid.getClass());
if (cls != null)
return getMetaData(cls, envLoader, mustExist);
@@ -944,7 +944,7 @@
// if still not match, register any classes that look
similar to
the
// oid class and check again
resolveIdentityClass(oid);
- if (processRegisteredClasses().length > 0) {
+ if (processRegisteredClasses(envLoader).length > 0) {
cls = (Class) _oids.get(oid.getClass());
if (cls != null)
return getMetaData(cls, envLoader, mustExist);
@@ -1262,7 +1262,7 @@
* Parses the metadata for all registered classes.
*/
private void loadRegisteredClassMetaData(ClassLoader envLoader) {
- Class[] reg = processRegisteredClasses();
+ Class[] reg = processRegisteredClasses(envLoader);
for (int i = 0; i < reg.length; i++) {
try {
getMetaData(reg[i], envLoader, false);
@@ -1276,7 +1276,7 @@
/**
* Updates our datastructures with the latest registered classes.
*/
- Class[] processRegisteredClasses() {
+ Class[] processRegisteredClasses(ClassLoader envLoader) {
if (_registered.isEmpty())
return EMPTY_CLASSES;
@@ -1289,9 +1289,18 @@
}
Collection failed = null;
+ Collection pcNames = getPersistentTypeNames(false,
envLoader);
for (int i = 0; i < reg.length; i++) {
try {
- processRegisteredClass(reg[i]);
+
+ /*
+ * Only process classes known to this
MetaDataRepository,
+ * since _registered contains all classes loaded by
+ * PCRegistry.
+ */
+ if (pcNames.contains(reg[i].getName())) {
+ processRegisteredClass(reg[i]);
+ }
} catch (Throwable t) {
if (!_conf.getRetryClassRegistration())
throw new
MetaDataException(_loc.get("error-registered",
Index: ClassMetaData.java
===================================================================
--- ClassMetaData.java
(.../tags/0.9.6/openjpa-kernel/src/main/java/org/apache/openjpa/meta)
(revision 4)
+++ ClassMetaData.java
(.../branches/0.9.6-ninthavenue/openjpa-kernel/src/main/java/org/
apache/openjpa/meta)
(working copy)
@@ -309,7 +309,7 @@
if (_owner != null)
return _repos.EMPTY_CLASSES;
- _repos.processRegisteredClasses();
+ _repos.processRegisteredClasses(getEnvClassLoader());
if (_subs == null) {
Collection subs = _repos.getPCSubclasses(_type);
_subs = (Class[]) subs.toArray(new Class[subs.size()]);
--
View this message in context: http://www.nabble.com/Shared-
classloader-and-subclasses-tf3431312.html#a9655900
Sent from the open-jpa-dev mailing list archive at Nabble.com.
_______________________________________________________________________
Notice: This email message, together with any attachments, may contain
information of BEA Systems, Inc., its subsidiaries and affiliated
entities, that may be confidential, proprietary, copyrighted and/or
legally privileged, and is intended solely for the use of the individual
or entity named in this message. If you are not the intended recipient,
and have received this message in error, please immediately return this
by email and then delete it.