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>