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