diff --git a/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java b/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java index 981db73c77..3a2db3a577 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java @@ -637,7 +637,7 @@ protected void injectInitialValue(Object obj) { ObjEntity entity; try { - entity = getEntityResolver().getObjEntity(object.getClass()); + entity = getEntityResolver().getObjEntity(object); } catch (CayenneRuntimeException ex) { // ObjEntity cannot be fetched, ignored entity = null; diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java index 392e739237..31e485f582 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java @@ -87,14 +87,14 @@ public interface ClassDescriptor { ClassDescriptor getSuperclassDescriptor(); /** - * Returns the most "specialized" descriptor for a given class. This method assumes + * Returns the most "specialized" descriptor for a given ObjEntity. This method assumes * that the following is true: - * + * *
- * this.getObjectClass().isAssignableFrom(objectClass) + * this.getObjectClass().isAssignableFrom(subEntity.getJavaClass()) **/ - ClassDescriptor getSubclassDescriptor(Class> objectClass); + ClassDescriptor getSubclassDescriptor(ObjEntity subEntity); /** * Creates a new instance of a class described by this object. diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java index 821334e8a6..1f08faba78 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java @@ -146,9 +146,9 @@ public PropertyDescriptor getProperty(String propertyName) { return descriptor.getProperty(propertyName); } - public ClassDescriptor getSubclassDescriptor(Class> objectClass) { + public ClassDescriptor getSubclassDescriptor(ObjEntity subEntity) { checkDescriptorInitialized(); - return descriptor.getSubclassDescriptor(objectClass); + return descriptor.getSubclassDescriptor(subEntity); } public ClassDescriptor getSuperclassDescriptor() { diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java index 24d83aee88..dcb691afd4 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java @@ -209,16 +209,16 @@ public void removeDeclaredProperty(String propertyName) { } /** - * Adds a subclass descriptor that maps to a given class name. + * Adds a subclass descriptor that maps to a given entity name. */ - public void addSubclassDescriptor(String className, ClassDescriptor subclassDescriptor) { + public void addSubclassDescriptor(String entityName, ClassDescriptor subclassDescriptor) { // note that 'className' should be used instead of // "subclassDescriptor.getEntity().getClassName()", as this method is // called in // the early phases of descriptor initialization and we do not want to // trigger // subclassDescriptor resolution just yet to prevent stack overflow. - subclassDescriptors.put(className, subclassDescriptor); + subclassDescriptors.put(entityName, subclassDescriptor); } public ObjEntity getEntity() { @@ -257,23 +257,26 @@ void setObjectClass(Class> objectClass) { this.objectClass = objectClass; } - public ClassDescriptor getSubclassDescriptor(Class> objectClass) { - if (objectClass == null) { - throw new IllegalArgumentException("Null objectClass"); + public ClassDescriptor getSubclassDescriptor(ObjEntity subEntity) { + if (subEntity == null) { + throw new IllegalArgumentException("Null subEntity"); } if (subclassDescriptors.isEmpty()) { return this; } - ClassDescriptor subclassDescriptor = subclassDescriptors.get(objectClass.getName()); + ClassDescriptor subclassDescriptor = subclassDescriptors.get(subEntity.getName()); // ascend via the class hierarchy (only doing it if there are multiple // choices) if (subclassDescriptor == null) { - Class> currentClass = objectClass; - while (subclassDescriptor == null && (currentClass = currentClass.getSuperclass()) != null) { - subclassDescriptor = subclassDescriptors.get(currentClass.getName()); + ObjEntity currentEntity = subEntity; + while (subclassDescriptor == null && (currentEntity = currentEntity.getSuperEntity()) != null) { + if(currentEntity == null){ + break; + } + subclassDescriptor = subclassDescriptors.get(currentEntity.getName()); } } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java index 68f3f7a4db..2c2d74ef26 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java @@ -173,7 +173,7 @@ protected void indexSubclassDescriptors(PersistentDescriptor descriptor, EntityI for (EntityInheritanceTree child : inheritanceTree.getChildren()) { ObjEntity childEntity = child.getEntity(); - descriptor.addSubclassDescriptor(childEntity.getClassName(), + descriptor.addSubclassDescriptor(childEntity.getName(), descriptorMap.getDescriptor(childEntity.getName())); indexSubclassDescriptors(descriptor, child); diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java b/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java index fe5c781ac9..e14d74ea5c 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java @@ -81,7 +81,7 @@ private