This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new c1f9be0  CAY-2675 A one-to-one relationship with meaningful PK can be 
nullified in the nested context.
c1f9be0 is described below

commit c1f9be0ca4688fa96403910fadbeb69f4d39abb9
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Tue Sep 22 16:50:48 2020 +0300

    CAY-2675 A one-to-one relationship with meaningful PK can be nullified in 
the nested context.
---
 RELEASE-NOTES.txt                                  |  1 +
 .../cayenne/CayenneContextMeaningfulPKIT.java      |  2 +-
 .../org/apache/cayenne/access/DataRowUtils.java    | 41 ++++-------
 .../DataContextEntityWithMeaningfulPKIT.java       | 18 +++++
 .../meaningful_pk/ClientMeaningfulPkDep2.java      | 12 ++++
 .../testdo/meaningful_pk/MeaningfulPkDep2.java     |  9 +++
 .../meaningful_pk/auto/_ClientMeaningfulPk.java    | 35 +++++++--
 .../auto/_ClientMeaningfulPkDep2.java              | 82 ++++++++++++++++++++++
 .../meaningful_pk/auto/_MeaningfulPKDep.java       |  2 +-
 .../meaningful_pk/auto/_MeaningfulPKTest1.java     |  2 +-
 .../testdo/meaningful_pk/auto/_MeaningfulPk.java   | 21 +++++-
 ...MeaningfulPKDep.java => _MeaningfulPkDep2.java} | 49 +++++++------
 .../meaningful_pk/auto/_MeaningfulPkTest2.java     |  2 +-
 .../src/test/resources/meaningful-pk.map.xml       | 16 +++++
 14 files changed, 231 insertions(+), 61 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 04ba3b3..d38d9fc 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -30,6 +30,7 @@ Bug Fixes:
 
 CAY-2591 Modeler: project becomes dirty after click on dbImport or cgen tab
 CAY-2671 QualifierTranslator fails to translate expressions with compound 
PKs/FKs
+CAY-2675 A one-to-one relationship with meaningful PK can be nullified in the 
nested context
 
 ----------------------------------
 Release: 4.2.M1
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
index 12d30f2..40b236d 100644
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
@@ -63,7 +63,7 @@ public class CayenneContextMeaningfulPKIT extends ClientCase {
         deleteAndCreateTwoMeaningfulPKsDataSet();
 
         List<?> results = ObjectSelect.query(ClientMeaningfulPk.class)
-                .orderBy(ClientMeaningfulPk.PK_PROPERTY, SortOrder.DESCENDING)
+                .orderBy(ClientMeaningfulPk.PK.desc())
                 .select(clientContext);
         assertEquals(2, results.size());
     }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowUtils.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowUtils.java
index b93be16..1a18ff6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowUtils.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowUtils.java
@@ -59,13 +59,10 @@ class DataRowUtils {
 
         if (state == PersistenceState.HOLLOW || 
descriptor.getEntity().isReadOnly()) {
             refreshObjectWithSnapshot(descriptor, object, snapshot, true);
-        }
-        else if (state != PersistenceState.COMMITTED) {
+        } else if (state != PersistenceState.COMMITTED) {
             forceMergeWithSnapshot(context, descriptor, object, snapshot);
-        }
-        else {
-            // do not invalidate to-many relationships, since they might have
-            // just been prefetched...
+        } else {
+            // do not invalidate to-many relationships, since they might have 
just been prefetched...
             refreshObjectWithSnapshot(descriptor, object, snapshot, false);
         }
     }
@@ -153,8 +150,7 @@ class DataRowUtils {
                     Object oldValue = diff != null ? 
diff.getSnapshotValue(property
                             .getName()) : null;
 
-                    // if value not modified, update it from snapshot,
-                    // otherwise leave it alone
+                    // if value not modified, update it from snapshot, 
otherwise leave it alone
                     if (property.equals(curValue, oldValue)
                             && !property.equals(newValue, curValue)) {
                         property.writePropertyDirectly(object, oldValue, 
newValue);
@@ -171,42 +167,35 @@ class DataRowUtils {
             public boolean visitToOne(ToOneProperty property) {
                 ObjRelationship relationship = property.getRelationship();
                 if (relationship.isToPK()) {
-                    // TODO: will this work for flattened, how do we save 
snapshots for
-                    // them?
+                    // TODO: will this work for flattened, how do we save 
snapshots for them?
 
-                    // if value not modified, update it from snapshot,
-                    // otherwise leave it alone
+                    // if value not modified, update it from snapshot, 
otherwise leave it alone
                     if (!isToOneTargetModified(property, object, diff)) {
 
                         DbRelationship dbRelationship = relationship
                                 .getDbRelationships()
                                 .get(0);
 
-                        // must check before creating ObjectId because of 
partial
-                        // snapshots
+                        // must check before creating ObjectId because of 
partial snapshots
                         if (hasFK(dbRelationship, snapshot)) {
                             ObjectId id = snapshot.createTargetObjectId(
                                     relationship.getTargetEntityName(),
-                                    dbRelationship);
+                                    dbRelationship
+                            );
 
                             if (diff == null
                                     || 
!diff.containsArcSnapshot(relationship.getName())
-                                    || !property.equals(id, diff
-                                            
.getArcSnapshotValue(relationship.getName()))) {
+                                    || !property.equals(id, 
diff.getArcSnapshotValue(relationship.getName()))) {
 
                                 if (id == null) {
                                     property.writeProperty(object, null, null);
-                                }
-                                else {
-                                    // we can't use 'localObject' if 
relationship is
-                                    // optional or inheritance is involved
+                                } else {
+                                    // we can't use 'localObject' if 
relationship is optional or inheritance is involved
                                     // .. must turn to fault instead
                                     if (!relationship
-                                            
.isSourceDefiningTargetPrecenseAndType(context
-                                                    .getEntityResolver())) {
+                                            
.isSourceDefiningTargetPrecenseAndType(context.getEntityResolver())) {
                                         property.invalidate(object);
-                                    }
-                                    else {
+                                    } else {
                                         property.writeProperty(
                                                 object,
                                                 null,
@@ -224,7 +213,7 @@ class DataRowUtils {
 
     static boolean hasFK(DbRelationship relationship, Map<String, Object> 
snapshot) {
         for (final DbJoin join : relationship.getJoins()) {
-            if (!snapshot.containsKey(join.getSourceName())) {
+            if (snapshot.get(join.getSourceName()) == null) {
                 return false;
             }
         }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKIT.java
index e65289d..e465da3 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKIT.java
@@ -30,6 +30,7 @@ import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKDep;
 import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKTest1;
 import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPk;
+import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkDep2;
 import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkTest2;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.ServerCase;
@@ -232,4 +233,21 @@ public class DataContextEntityWithMeaningfulPKIT extends 
ServerCase {
         dep2.setPk(10);
         context.commitChanges();
     }
+
+    @Test
+    public void testMeaningfulFKToOneInvalidate() {
+        MeaningfulPk pk = context.newObject(MeaningfulPk.class);
+        MeaningfulPkDep2 dep = context.newObject(MeaningfulPkDep2.class);
+        dep.setMeaningfulPk(pk);
+        dep.setDescr("test");
+
+        ObjectContext childContext = runtime.newContext(context);
+
+        MeaningfulPkDep2 depChild = childContext.localObject(dep);
+        depChild.setDescr("test2");
+
+        assertEquals("test2", depChild.getDescr());
+        assertNotNull(depChild.getMeaningfulPk());
+        assertNull(depChild.getMeaningfulPk().getPk());
+    }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/ClientMeaningfulPkDep2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/ClientMeaningfulPkDep2.java
new file mode 100644
index 0000000..304e538
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/ClientMeaningfulPkDep2.java
@@ -0,0 +1,12 @@
+package org.apache.cayenne.testdo.meaningful_pk;
+
+import org.apache.cayenne.testdo.meaningful_pk.auto._ClientMeaningfulPkDep2;
+
+/**
+ * A persistent class mapped as "MeaningfulPkDep2" Cayenne entity.
+ */
+public class ClientMeaningfulPkDep2 extends _ClientMeaningfulPkDep2 {
+
+     private static final long serialVersionUID = 1L;
+     
+}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/MeaningfulPkDep2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/MeaningfulPkDep2.java
new file mode 100644
index 0000000..0d25cd5
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/MeaningfulPkDep2.java
@@ -0,0 +1,9 @@
+package org.apache.cayenne.testdo.meaningful_pk;
+
+import org.apache.cayenne.testdo.meaningful_pk.auto._MeaningfulPkDep2;
+
+public class MeaningfulPkDep2 extends _MeaningfulPkDep2 {
+
+    private static final long serialVersionUID = 1L;
+
+}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPk.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPk.java
index 6c9be4b..e5de448 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPk.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPk.java
@@ -1,6 +1,12 @@
 package org.apache.cayenne.testdo.meaningful_pk.auto;
 
 import org.apache.cayenne.PersistentObject;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.exp.property.EntityProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
+import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.meaningful_pk.ClientMeaningfulPkDep2;
+import org.apache.cayenne.util.PersistentObjectHolder;
 
 /**
  * A generated persistent class mapped as "MeaningfulPk" Cayenne entity. It is 
a good idea to
@@ -9,29 +15,48 @@ import org.apache.cayenne.PersistentObject;
  */
 public abstract class _ClientMeaningfulPk extends PersistentObject {
 
-    public static final String PK_PROPERTY = "pk";
+    public static final StringProperty<String> PK = 
PropertyFactory.createString("pk", String.class);
+    public static final EntityProperty<ClientMeaningfulPkDep2> 
MEANINGFUL_PK_DEP2S = PropertyFactory.createEntity("meaningfulPkDep2s", 
ClientMeaningfulPkDep2.class);
 
     protected String pk;
+    protected ValueHolder<ClientMeaningfulPkDep2> meaningfulPkDep2s;
 
     public String getPk() {
         if(objectContext != null) {
             objectContext.prepareForAccess(this, "pk", false);
         }
 
+
         return pk;
     }
+
     public void setPk(String pk) {
         if(objectContext != null) {
             objectContext.prepareForAccess(this, "pk", false);
+            objectContext.propertyChanged(this, "pk", this.pk, pk);
         }
 
-        Object oldValue = this.pk;
         this.pk = pk;
+    }
 
-        // notify objectContext about simple property change
+    public ClientMeaningfulPkDep2 getMeaningfulPkDep2s() {
         if(objectContext != null) {
-            objectContext.propertyChanged(this, "pk", oldValue, pk);
-        }
+            objectContext.prepareForAccess(this, "meaningfulPkDep2s", true);
+        } else if (this.meaningfulPkDep2s == null) {
+               this.meaningfulPkDep2s = new PersistentObjectHolder<>(this, 
"meaningfulPkDep2s");
+               }
+
+        return meaningfulPkDep2s.getValue();
+    }
+
+    public void setMeaningfulPkDep2s(ClientMeaningfulPkDep2 meaningfulPkDep2s) 
{
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "meaningfulPkDep2s", true);
+        } else if (this.meaningfulPkDep2s == null) {
+               this.meaningfulPkDep2s = new PersistentObjectHolder<>(this, 
"meaningfulPkDep2s");
+               }
+
+        this.meaningfulPkDep2s.setValue(meaningfulPkDep2s);
     }
 
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPkDep2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPkDep2.java
new file mode 100644
index 0000000..2e5fafb
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_ClientMeaningfulPkDep2.java
@@ -0,0 +1,82 @@
+package org.apache.cayenne.testdo.meaningful_pk.auto;
+
+import org.apache.cayenne.PersistentObject;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.exp.property.EntityProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
+import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.meaningful_pk.ClientMeaningfulPk;
+import org.apache.cayenne.util.PersistentObjectHolder;
+
+/**
+ * A generated persistent class mapped as "MeaningfulPkDep2" Cayenne entity. 
It is a good idea to
+ * avoid changing this class manually, since it will be overwritten next time 
code is
+ * regenerated. If you need to make any customizations, put them in a subclass.
+ */
+public abstract class _ClientMeaningfulPkDep2 extends PersistentObject {
+
+    public static final StringProperty<String> DESCR = 
PropertyFactory.createString("descr", String.class);
+    public static final StringProperty<String> PK = 
PropertyFactory.createString("pk", String.class);
+    public static final EntityProperty<ClientMeaningfulPk> MEANINGFUL_PK = 
PropertyFactory.createEntity("meaningfulPk", ClientMeaningfulPk.class);
+
+    protected String descr;
+    protected String pk;
+    protected ValueHolder<ClientMeaningfulPk> meaningfulPk;
+
+    public String getDescr() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "descr", false);
+        }
+
+
+        return descr;
+    }
+
+    public void setDescr(String descr) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "descr", false);
+            objectContext.propertyChanged(this, "descr", this.descr, descr);
+        }
+
+        this.descr = descr;
+    }
+
+    public String getPk() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "pk", false);
+        }
+
+
+        return pk;
+    }
+
+    public void setPk(String pk) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "pk", false);
+            objectContext.propertyChanged(this, "pk", this.pk, pk);
+        }
+
+        this.pk = pk;
+    }
+
+    public ClientMeaningfulPk getMeaningfulPk() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "meaningfulPk", true);
+        } else if (this.meaningfulPk == null) {
+               this.meaningfulPk = new PersistentObjectHolder<>(this, 
"meaningfulPk");
+               }
+
+        return meaningfulPk.getValue();
+    }
+
+    public void setMeaningfulPk(ClientMeaningfulPk meaningfulPk) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "meaningfulPk", true);
+        } else if (this.meaningfulPk == null) {
+               this.meaningfulPk = new PersistentObjectHolder<>(this, 
"meaningfulPk");
+               }
+
+        this.meaningfulPk.setValue(meaningfulPk);
+    }
+
+}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
index d3de2b7..0074b75 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
@@ -19,7 +19,7 @@ import 
org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKTest1;
  */
 public abstract class _MeaningfulPKDep extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
 
     public static final String PK_ATTRIBUTE_PK_COLUMN = "PK_ATTRIBUTE";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
index 80a2e26..b4d0b42 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
@@ -20,7 +20,7 @@ import 
org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKDep;
  */
 public abstract class _MeaningfulPKTest1 extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
 
     public static final String PK_ATTRIBUTE_PK_COLUMN = "PK_ATTRIBUTE";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
index 780a3d3..04f34f8 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
 import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkDep2;
 
 /**
  * Class _MeaningfulPk was generated by Cayenne.
@@ -16,14 +18,16 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _MeaningfulPk extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
 
     public static final String PK_PK_COLUMN = "PK";
 
     public static final StringProperty<String> PK = 
PropertyFactory.createString("pk", String.class);
+    public static final EntityProperty<MeaningfulPkDep2> MEANINGFUL_PK_DEP2S = 
PropertyFactory.createEntity("meaningfulPkDep2s", MeaningfulPkDep2.class);
 
     protected String pk;
 
+    protected Object meaningfulPkDep2s;
 
     public void setPk(String pk) {
         beforePropertyWrite("pk", this.pk, pk);
@@ -35,6 +39,14 @@ public abstract class _MeaningfulPk extends BaseDataObject {
         return this.pk;
     }
 
+    public void setMeaningfulPkDep2s(MeaningfulPkDep2 meaningfulPkDep2s) {
+        setToOneTarget("meaningfulPkDep2s", meaningfulPkDep2s, true);
+    }
+
+    public MeaningfulPkDep2 getMeaningfulPkDep2s() {
+        return (MeaningfulPkDep2)readProperty("meaningfulPkDep2s");
+    }
+
     @Override
     public Object readPropertyDirectly(String propName) {
         if(propName == null) {
@@ -44,6 +56,8 @@ public abstract class _MeaningfulPk extends BaseDataObject {
         switch(propName) {
             case "pk":
                 return this.pk;
+            case "meaningfulPkDep2s":
+                return this.meaningfulPkDep2s;
             default:
                 return super.readPropertyDirectly(propName);
         }
@@ -59,6 +73,9 @@ public abstract class _MeaningfulPk extends BaseDataObject {
             case "pk":
                 this.pk = (String)val;
                 break;
+            case "meaningfulPkDep2s":
+                this.meaningfulPkDep2s = val;
+                break;
             default:
                 super.writePropertyDirectly(propName, val);
         }
@@ -76,12 +93,14 @@ public abstract class _MeaningfulPk extends BaseDataObject {
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
         out.writeObject(this.pk);
+        out.writeObject(this.meaningfulPkDep2s);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
         super.readState(in);
         this.pk = (String)in.readObject();
+        this.meaningfulPkDep2s = in.readObject();
     }
 
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkDep2.java
similarity index 65%
copy from 
cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
copy to 
cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkDep2.java
index d3de2b7..4179c7a 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkDep2.java
@@ -6,31 +6,30 @@ import java.io.ObjectOutputStream;
 
 import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.NumericProperty;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKTest1;
+import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPk;
 
 /**
- * Class _MeaningfulPKDep was generated by Cayenne.
+ * Class _MeaningfulPkDep2 was generated by Cayenne.
  * It is probably a good idea to avoid changing this class manually,
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MeaningfulPKDep extends BaseDataObject {
+public abstract class _MeaningfulPkDep2 extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
 
-    public static final String PK_ATTRIBUTE_PK_COLUMN = "PK_ATTRIBUTE";
+    public static final String PK_PK_COLUMN = "PK";
 
     public static final StringProperty<String> DESCR = 
PropertyFactory.createString("descr", String.class);
-    public static final NumericProperty<Integer> PK = 
PropertyFactory.createNumeric("pk", Integer.class);
-    public static final EntityProperty<MeaningfulPKTest1> TO_MEANINGFUL_PK = 
PropertyFactory.createEntity("toMeaningfulPK", MeaningfulPKTest1.class);
+    public static final StringProperty<String> PK = 
PropertyFactory.createString("pk", String.class);
+    public static final EntityProperty<MeaningfulPk> MEANINGFUL_PK = 
PropertyFactory.createEntity("meaningfulPk", MeaningfulPk.class);
 
     protected String descr;
-    protected int pk;
+    protected String pk;
 
-    protected Object toMeaningfulPK;
+    protected Object meaningfulPk;
 
     public void setDescr(String descr) {
         beforePropertyWrite("descr", this.descr, descr);
@@ -42,22 +41,22 @@ public abstract class _MeaningfulPKDep extends 
BaseDataObject {
         return this.descr;
     }
 
-    public void setPk(int pk) {
+    public void setPk(String pk) {
         beforePropertyWrite("pk", this.pk, pk);
         this.pk = pk;
     }
 
-    public int getPk() {
+    public String getPk() {
         beforePropertyRead("pk");
         return this.pk;
     }
 
-    public void setToMeaningfulPK(MeaningfulPKTest1 toMeaningfulPK) {
-        setToOneTarget("toMeaningfulPK", toMeaningfulPK, true);
+    public void setMeaningfulPk(MeaningfulPk meaningfulPk) {
+        setToOneTarget("meaningfulPk", meaningfulPk, true);
     }
 
-    public MeaningfulPKTest1 getToMeaningfulPK() {
-        return (MeaningfulPKTest1)readProperty("toMeaningfulPK");
+    public MeaningfulPk getMeaningfulPk() {
+        return (MeaningfulPk)readProperty("meaningfulPk");
     }
 
     @Override
@@ -71,8 +70,8 @@ public abstract class _MeaningfulPKDep extends BaseDataObject 
{
                 return this.descr;
             case "pk":
                 return this.pk;
-            case "toMeaningfulPK":
-                return this.toMeaningfulPK;
+            case "meaningfulPk":
+                return this.meaningfulPk;
             default:
                 return super.readPropertyDirectly(propName);
         }
@@ -89,10 +88,10 @@ public abstract class _MeaningfulPKDep extends 
BaseDataObject {
                 this.descr = (String)val;
                 break;
             case "pk":
-                this.pk = val == null ? 0 : (int)val;
+                this.pk = (String)val;
                 break;
-            case "toMeaningfulPK":
-                this.toMeaningfulPK = val;
+            case "meaningfulPk":
+                this.meaningfulPk = val;
                 break;
             default:
                 super.writePropertyDirectly(propName, val);
@@ -111,16 +110,16 @@ public abstract class _MeaningfulPKDep extends 
BaseDataObject {
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
         out.writeObject(this.descr);
-        out.writeInt(this.pk);
-        out.writeObject(this.toMeaningfulPK);
+        out.writeObject(this.pk);
+        out.writeObject(this.meaningfulPk);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
         super.readState(in);
         this.descr = (String)in.readObject();
-        this.pk = in.readInt();
-        this.toMeaningfulPK = in.readObject();
+        this.pk = (String)in.readObject();
+        this.meaningfulPk = in.readObject();
     }
 
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkTest2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkTest2.java
index 566f556..f4d2d0d 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkTest2.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPkTest2.java
@@ -16,7 +16,7 @@ import org.apache.cayenne.exp.property.PropertyFactory;
  */
 public abstract class _MeaningfulPkTest2 extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
 
     public static final String PK_ATTRIBUTE_PK_COLUMN = "PK_ATTRIBUTE";
 
diff --git a/cayenne-server/src/test/resources/meaningful-pk.map.xml 
b/cayenne-server/src/test/resources/meaningful-pk.map.xml
index d774b7f..2ed609d 100644
--- a/cayenne-server/src/test/resources/meaningful-pk.map.xml
+++ b/cayenne-server/src/test/resources/meaningful-pk.map.xml
@@ -14,6 +14,10 @@
                <db-attribute name="MASTER_PK" type="INTEGER"/>
                <db-attribute name="PK_ATTRIBUTE" type="INTEGER" 
isPrimaryKey="true" isMandatory="true"/>
        </db-entity>
+       <db-entity name="MEANINGFUL_PK_DEP2">
+               <db-attribute name="DESCR" type="VARCHAR" length="50"/>
+               <db-attribute name="PK" type="VARCHAR" isPrimaryKey="true" 
isMandatory="true" length="100"/>
+       </db-entity>
        <db-entity name="MEANINGFUL_PK_TEST1">
                <db-attribute name="DESCR" type="VARCHAR" length="50"/>
                <db-attribute name="INT_ATTRIBUTE" type="INTEGER" 
isMandatory="true"/>
@@ -38,17 +42,29 @@
        <obj-entity name="MeaningfulPk" 
className="org.apache.cayenne.testdo.meaningful_pk.MeaningfulPk" 
clientClassName="org.apache.cayenne.testdo.meaningful_pk.ClientMeaningfulPk" 
dbEntityName="MEANINGFUL_PK">
                <obj-attribute name="pk" type="java.lang.String" 
db-attribute-path="PK"/>
        </obj-entity>
+       <obj-entity name="MeaningfulPkDep2" 
className="org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkDep2" 
clientClassName="org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkDep2" 
dbEntityName="MEANINGFUL_PK_DEP2">
+               <obj-attribute name="descr" type="java.lang.String" 
db-attribute-path="DESCR"/>
+               <obj-attribute name="pk" type="java.lang.String" 
db-attribute-path="PK"/>
+       </obj-entity>
        <obj-entity name="MeaningfulPkTest2" 
className="org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkTest2" 
clientClassName="org.apache.cayenne.testdo.meaningful_pk.MeaningfulPkTest2" 
dbEntityName="MEANINGFUL_PK_TEST2">
                <obj-attribute name="integerAttribute" type="java.lang.Integer" 
db-attribute-path="INTEGER_ATTRIBUTE"/>
                <obj-attribute name="integerNullableAttribute" 
type="java.lang.Integer" db-attribute-path="INTEGER_NULLABLE_ATTRIBUTE"/>
                <obj-attribute name="pkAttribute" type="java.lang.Integer" 
db-attribute-path="PK_ATTRIBUTE"/>
        </obj-entity>
+       <db-relationship name="dep2" source="MEANINGFUL_PK" 
target="MEANINGFUL_PK_DEP2" toDependentPK="true">
+               <db-attribute-pair source="PK" target="PK"/>
+       </db-relationship>
        <db-relationship name="toMeaningfulPK" source="MEANINGFUL_PK_DEP" 
target="MEANINGFUL_PK_TEST1">
                <db-attribute-pair source="MASTER_PK" target="PK_ATTRIBUTE"/>
        </db-relationship>
+       <db-relationship name="meaningfulPk" source="MEANINGFUL_PK_DEP2" 
target="MEANINGFUL_PK">
+               <db-attribute-pair source="PK" target="PK"/>
+       </db-relationship>
        <db-relationship name="meaningfulPKDepArray" 
source="MEANINGFUL_PK_TEST1" target="MEANINGFUL_PK_DEP" toMany="true">
                <db-attribute-pair source="PK_ATTRIBUTE" target="MASTER_PK"/>
        </db-relationship>
        <obj-relationship name="toMeaningfulPK" source="MeaningfulPKDep" 
target="MeaningfulPKTest1" db-relationship-path="toMeaningfulPK"/>
        <obj-relationship name="meaningfulPKDepArray" 
source="MeaningfulPKTest1" target="MeaningfulPKDep" deleteRule="Cascade" 
db-relationship-path="meaningfulPKDepArray"/>
+       <obj-relationship name="meaningfulPkDep2s" source="MeaningfulPk" 
target="MeaningfulPkDep2" deleteRule="Deny" db-relationship-path="dep2"/>
+       <obj-relationship name="meaningfulPk" source="MeaningfulPkDep2" 
target="MeaningfulPk" deleteRule="Nullify" db-relationship-path="meaningfulPk"/>
 </data-map>

Reply via email to