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 <[email protected]>
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>