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 51f97f6 СAY-2712 Shouldn't run batch inserts with generated keys if
there is a reflexive dependency
51f97f6 is described below
commit 51f97f602ccded98a45750551ae329f639c05261
Author: Nikita Timofeev <[email protected]>
AuthorDate: Mon Jun 7 15:34:08 2021 +0300
СAY-2712 Shouldn't run batch inserts with generated keys if there is a
reflexive dependency
---
.../apache/cayenne/access/jdbc/BatchAction.java | 35 ++++++++++++++--------
.../cayenne/ashwood/AshwoodEntitySorter.java | 1 +
.../org/apache/cayenne/map/EntityResolver.java | 18 +++++++++++
.../java/org/apache/cayenne/CDOReflexiveRelIT.java | 12 ++++++++
.../apache/cayenne/access/IdentityColumnsIT.java | 23 ++++++++++++++
.../testdo/generated/GeneratedReflexive.java | 9 ++++++
.../generated/auto/_GeneratedColumnCompKey.java | 7 +----
.../generated/auto/_GeneratedColumnCompMaster.java | 5 +---
.../testdo/generated/auto/_GeneratedColumnDep.java | 5 +---
.../generated/auto/_GeneratedColumnTest2.java | 5 +---
.../generated/auto/_GeneratedColumnTestEntity.java | 5 +---
.../testdo/generated/auto/_GeneratedF1.java | 5 +---
.../testdo/generated/auto/_GeneratedF2.java | 5 +---
...edColumnTest2.java => _GeneratedReflexive.java} | 32 +++++++++++++++-----
.../src/test/resources/cayenne-generated.xml | 2 ++
.../src/test/resources/generated.map.xml | 14 ++++++++-
16 files changed, 132 insertions(+), 51 deletions(-)
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
index 6f798e3..4b0dc90 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
@@ -55,7 +55,7 @@ public class BatchAction extends BaseSQLAction {
protected RowDescriptor keyRowDescriptor;
private static void bind(DbAdapter adapter, PreparedStatement
statement, DbAttributeBinding[] bindings)
- throws SQLException, Exception {
+ throws Exception {
for (DbAttributeBinding b : bindings) {
if (!b.isExcluded()) {
@@ -81,20 +81,31 @@ public class BatchAction extends BaseSQLAction {
}
@Override
- public void performAction(Connection connection, OperationObserver
observer) throws SQLException, Exception {
-
+ public void performAction(Connection connection, OperationObserver
observer) throws Exception {
BatchTranslator translator = createTranslator();
-
- boolean isBatch = runningAsBatch && query.getRows().size() > 1;
- if (isBatch && hasGeneratedKeys() &&
!supportsGeneratedKeys(isBatch)) {
- isBatch = false; // turn off batch mode if we generate
keys but can't do so in a batch
- }
-
+
+ boolean isBatch = canRunAsBatch();
+ boolean generatesKeys = hasGeneratedKeys() &&
supportsGeneratedKeys(isBatch);
+
if (isBatch) {
- runAsBatch(connection, translator, observer,
hasGeneratedKeys() && supportsGeneratedKeys(isBatch));
+ runAsBatch(connection, translator, observer,
generatesKeys);
} else {
- runAsIndividualQueries(connection, translator,
observer, hasGeneratedKeys() && supportsGeneratedKeys(isBatch));
+ runAsIndividualQueries(connection, translator,
observer, generatesKeys);
+ }
+ }
+
+ protected boolean canRunAsBatch() {
+ if(!runningAsBatch || query.getRows().size() <= 1) {
+ return false;
}
+
+ if (hasGeneratedKeys()) {
+ // turn off batch mode if we generate keys but can't do
so in a batch
+ return supportsGeneratedKeys(true) &&
+
!dataNode.getEntityResolver().getEntitySorter().isReflexive(query.getDbEntity());
+ }
+
+ return true;
}
protected BatchTranslator createTranslator() {
@@ -102,7 +113,7 @@ public class BatchAction extends BaseSQLAction {
}
protected void runAsBatch(Connection con, BatchTranslator translator,
OperationObserver delegate, boolean generatesKeys)
- throws SQLException, Exception {
+ throws Exception {
String sql = translator.getSql();
JdbcEventLogger logger = dataNode.getJdbcEventLogger();
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
index 97c85e1..169ad91 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
@@ -170,6 +170,7 @@ public class AshwoodEntitySorter implements EntitySorter {
@Override
public void setEntityResolver(EntityResolver entityResolver) {
this.entityResolver = entityResolver;
+ this.entityResolver.setEntitySorter(this);
this.dirty = true;
}
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
index b62bfa3..ad0fd28 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
@@ -100,6 +100,11 @@ public class EntityResolver implements MappingNamespace,
Serializable {
*/
protected transient ValueComparisonStrategyFactory
valueComparisonStrategyFactory;
+ /**
+ * @since 4.2
+ */
+ protected transient EntitySorter entitySorter;
+
/**
* Creates new empty EntityResolver.
@@ -604,4 +609,17 @@ public class EntityResolver implements MappingNamespace,
Serializable {
this.valueComparisonStrategyFactory = valueComparisonStrategyFactory;
}
+ /**
+ * @since 4.2
+ */
+ public void setEntitySorter(EntitySorter entitySorter) {
+ this.entitySorter = entitySorter;
+ }
+
+ /**
+ * @since 4.2
+ */
+ public EntitySorter getEntitySorter() {
+ return entitySorter;
+ }
}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/CDOReflexiveRelIT.java
b/cayenne-server/src/test/java/org/apache/cayenne/CDOReflexiveRelIT.java
index 229031e..471955f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/CDOReflexiveRelIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/CDOReflexiveRelIT.java
@@ -49,6 +49,18 @@ public class CDOReflexiveRelIT extends ServerCase {
}
@Test
+ public void testAdd() {
+ ArtGroup parentGroup = context.newObject(ArtGroup.class);
+ parentGroup.setName("parent");
+
+ ArtGroup childGroup1 = context.newObject(ArtGroup.class);
+ childGroup1.setName("child1");
+ childGroup1.setToParentGroup(parentGroup);
+
+ context.commitChanges();
+ }
+
+ @Test
public void testAddDeleteWithCommit() {
ArtGroup parentGroup = context.newObject(ArtGroup.class);
parentGroup.setName("parent");
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
b/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
index 1a71fe8..c5df077 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
@@ -39,6 +39,7 @@ import
org.apache.cayenne.testdo.generated.GeneratedColumnTest2;
import org.apache.cayenne.testdo.generated.GeneratedColumnTestEntity;
import org.apache.cayenne.testdo.generated.GeneratedF1;
import org.apache.cayenne.testdo.generated.GeneratedF2;
+import org.apache.cayenne.testdo.generated.GeneratedReflexive;
import org.apache.cayenne.unit.di.server.CayenneProjects;
import org.apache.cayenne.unit.di.server.ServerCase;
import org.apache.cayenne.unit.di.server.UseServerRuntime;
@@ -339,4 +340,26 @@ public class IdentityColumnsIT extends ServerCase {
assertNotNull(Cayenne.objectForPK(context,
GeneratedColumnTestEntity.class, id1));
assertNotNull(Cayenne.objectForPK(context, GeneratedColumnDep.class,
id2));
}
+
+ @Test
+ public void testReflexiveDep() {
+
+ GeneratedReflexive reflexive3 =
context.newObject(GeneratedReflexive.class);
+ reflexive3.setName("3");
+
+ GeneratedReflexive reflexive2 =
context.newObject(GeneratedReflexive.class);
+ reflexive2.setName("2");
+
+ GeneratedReflexive reflexive4 =
context.newObject(GeneratedReflexive.class);
+ reflexive4.setName("4");
+
+ GeneratedReflexive reflexive1 =
context.newObject(GeneratedReflexive.class);
+ reflexive1.setName("1");
+
+ reflexive1.setNext(reflexive2);
+ reflexive2.setNext(reflexive3);
+ reflexive3.setNext(reflexive4);
+
+ context.commitChanges();
+ }
}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/GeneratedReflexive.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/GeneratedReflexive.java
new file mode 100644
index 0000000..7f7fec1
--- /dev/null
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/GeneratedReflexive.java
@@ -0,0 +1,9 @@
+package org.apache.cayenne.testdo.generated;
+
+import org.apache.cayenne.testdo.generated.auto._GeneratedReflexive;
+
+public class GeneratedReflexive extends _GeneratedReflexive {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
index 79435a2..cbe6ba9 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
@@ -5,9 +5,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
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.generated.GeneratedColumnCompMaster;
@@ -20,13 +18,10 @@ import
org.apache.cayenne.testdo.generated.GeneratedColumnCompMaster;
*/
public abstract class _GeneratedColumnCompKey extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> AUTO_PK_PK_PROPERTY =
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("AUTO_PK"),
Integer.class);
public static final String AUTO_PK_PK_COLUMN = "AUTO_PK";
- public static final NumericProperty<Integer> GENERATED_COLUMN_PK_PROPERTY
=
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("GENERATED_COLUMN"),
Integer.class);
public static final String GENERATED_COLUMN_PK_COLUMN = "GENERATED_COLUMN";
- public static final NumericProperty<Integer> PROPAGATED_PK_PK_PROPERTY =
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("PROPAGATED_PK"),
Integer.class);
public static final String PROPAGATED_PK_PK_COLUMN = "PROPAGATED_PK";
public static final StringProperty<String> NAME =
PropertyFactory.createString("name", String.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
index 13b3a09..937d393 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
@@ -6,9 +6,7 @@ import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.exp.property.ListProperty;
-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.generated.GeneratedColumnCompKey;
@@ -21,9 +19,8 @@ import
org.apache.cayenne.testdo.generated.GeneratedColumnCompKey;
*/
public abstract class _GeneratedColumnCompMaster extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> ID_PK_PROPERTY =
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("ID"), Integer.class);
public static final String ID_PK_COLUMN = "ID";
public static final StringProperty<String> NAME =
PropertyFactory.createString("name", String.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
index d647e25..4de74b8 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
@@ -5,9 +5,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
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.generated.GeneratedColumnTestEntity;
@@ -20,9 +18,8 @@ import
org.apache.cayenne.testdo.generated.GeneratedColumnTestEntity;
*/
public abstract class _GeneratedColumnDep extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer>
GENERATED_COLUMN_FK_PK_PROPERTY =
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("GENERATED_COLUMN_FK"),
Integer.class);
public static final String GENERATED_COLUMN_FK_PK_COLUMN =
"GENERATED_COLUMN_FK";
public static final StringProperty<String> NAME =
PropertyFactory.createString("name", String.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
index 6d1d7af..f12ad6a 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
@@ -5,8 +5,6 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.property.NumericProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
@@ -18,9 +16,8 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _GeneratedColumnTest2 extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> GENERATED_COLUMN_PK_PROPERTY
=
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("GENERATED_COLUMN"),
Integer.class);
public static final String GENERATED_COLUMN_PK_COLUMN = "GENERATED_COLUMN";
public static final StringProperty<String> NAME =
PropertyFactory.createString("name", String.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
index 6e7283d..1e7cc3c 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
@@ -5,9 +5,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
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.generated.GeneratedColumnDep;
@@ -20,9 +18,8 @@ import org.apache.cayenne.testdo.generated.GeneratedColumnDep;
*/
public abstract class _GeneratedColumnTestEntity extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> GENERATED_COLUMN_PK_PROPERTY
=
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("GENERATED_COLUMN"),
Integer.class);
public static final String GENERATED_COLUMN_PK_COLUMN = "GENERATED_COLUMN";
public static final StringProperty<String> NAME =
PropertyFactory.createString("name", String.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
index 0749b4b..1c8d52a 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
@@ -6,9 +6,7 @@ import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.cayenne.CayenneDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.NumericProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.testdo.generated.GeneratedF2;
@@ -20,9 +18,8 @@ import org.apache.cayenne.testdo.generated.GeneratedF2;
*/
public abstract class _GeneratedF1 extends CayenneDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> ID_PK_PROPERTY =
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("ID"), Integer.class);
public static final String ID_PK_COLUMN = "ID";
public static final ListProperty<GeneratedF2> F2 =
PropertyFactory.createList("f2", GeneratedF2.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
index 0716c67..8c0caaa 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
@@ -6,9 +6,7 @@ import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.cayenne.CayenneDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.NumericProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.testdo.generated.GeneratedF1;
@@ -20,9 +18,8 @@ import org.apache.cayenne.testdo.generated.GeneratedF1;
*/
public abstract class _GeneratedF2 extends CayenneDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> ID_PK_PROPERTY =
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("ID"), Integer.class);
public static final String ID_PK_COLUMN = "ID";
public static final ListProperty<GeneratedF1> F1 =
PropertyFactory.createList("f1", GeneratedF1.class);
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedReflexive.java
similarity index 69%
copy from
cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
copy to
cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedReflexive.java
index 6d1d7af..b360c99 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedReflexive.java
@@ -4,29 +4,30 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.property.NumericProperty;
+import org.apache.cayenne.CayenneDataObject;
+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.generated.GeneratedReflexive;
/**
- * Class _GeneratedColumnTest2 was generated by Cayenne.
+ * Class _GeneratedReflexive 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 _GeneratedColumnTest2 extends BaseDataObject {
+public abstract class _GeneratedReflexive extends CayenneDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- public static final NumericProperty<Integer> GENERATED_COLUMN_PK_PROPERTY
=
PropertyFactory.createNumeric(ExpressionFactory.dbPathExp("GENERATED_COLUMN"),
Integer.class);
- public static final String GENERATED_COLUMN_PK_COLUMN = "GENERATED_COLUMN";
+ public static final String ID_PK_COLUMN = "ID";
public static final StringProperty<String> NAME =
PropertyFactory.createString("name", String.class);
+ public static final EntityProperty<GeneratedReflexive> NEXT =
PropertyFactory.createEntity("next", GeneratedReflexive.class);
protected String name;
+ protected Object next;
public void setName(String name) {
beforePropertyWrite("name", this.name, name);
@@ -38,6 +39,14 @@ public abstract class _GeneratedColumnTest2 extends
BaseDataObject {
return this.name;
}
+ public void setNext(GeneratedReflexive next) {
+ setToOneTarget("next", next, true);
+ }
+
+ public GeneratedReflexive getNext() {
+ return (GeneratedReflexive)readProperty("next");
+ }
+
@Override
public Object readPropertyDirectly(String propName) {
if(propName == null) {
@@ -47,6 +56,8 @@ public abstract class _GeneratedColumnTest2 extends
BaseDataObject {
switch(propName) {
case "name":
return this.name;
+ case "next":
+ return this.next;
default:
return super.readPropertyDirectly(propName);
}
@@ -62,6 +73,9 @@ public abstract class _GeneratedColumnTest2 extends
BaseDataObject {
case "name":
this.name = (String)val;
break;
+ case "next":
+ this.next = val;
+ break;
default:
super.writePropertyDirectly(propName, val);
}
@@ -79,12 +93,14 @@ public abstract class _GeneratedColumnTest2 extends
BaseDataObject {
protected void writeState(ObjectOutputStream out) throws IOException {
super.writeState(out);
out.writeObject(this.name);
+ out.writeObject(this.next);
}
@Override
protected void readState(ObjectInputStream in) throws IOException,
ClassNotFoundException {
super.readState(in);
this.name = (String)in.readObject();
+ this.next = in.readObject();
}
}
diff --git a/cayenne-server/src/test/resources/cayenne-generated.xml
b/cayenne-server/src/test/resources/cayenne-generated.xml
index 5742090..9f684cc 100644
--- a/cayenne-server/src/test/resources/cayenne-generated.xml
+++ b/cayenne-server/src/test/resources/cayenne-generated.xml
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain
https://cayenne.apache.org/schema/10/domain.xsd"
project-version="10">
<map name="generated"/>
</domain>
diff --git a/cayenne-server/src/test/resources/generated.map.xml
b/cayenne-server/src/test/resources/generated.map.xml
index a46b4a9..549203c 100644
--- a/cayenne-server/src/test/resources/generated.map.xml
+++ b/cayenne-server/src/test/resources/generated.map.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap
http://cayenne.apache.org/schema/10/modelMap.xsd"
+ xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap
https://cayenne.apache.org/schema/10/modelMap.xsd"
project-version="10">
<property name="defaultPackage"
value="org.apache.cayenne.testdo.generated"/>
<property name="defaultSuperclass"
value="org.apache.cayenne.CayenneDataObject"/>
@@ -41,6 +41,11 @@
<db-attribute name="ID1" type="INTEGER"/>
<db-attribute name="ID2" type="INTEGER"/>
</db-entity>
+ <db-entity name="GENERATED_REFLEXIVE">
+ <db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
isGenerated="true" isMandatory="true"/>
+ <db-attribute name="NAME" type="VARCHAR" length="255"/>
+ <db-attribute name="REF_ID" type="INTEGER"/>
+ </db-entity>
<obj-entity name="GeneratedColumnCompKey"
className="org.apache.cayenne.testdo.generated.GeneratedColumnCompKey"
dbEntityName="GENERATED_COLUMN_COMP_KEY">
<obj-attribute name="name" type="java.lang.String"
db-attribute-path="NAME"/>
</obj-entity>
@@ -58,6 +63,9 @@
</obj-entity>
<obj-entity name="GeneratedF1"
className="org.apache.cayenne.testdo.generated.GeneratedF1"
clientClassName="test.client.GeneratedF1" dbEntityName="GENERATED_F1"
superClassName="org.apache.cayenne.CayenneDataObject"
clientSuperClassName="org.apache.cayenne.PersistentObject"/>
<obj-entity name="GeneratedF2"
className="org.apache.cayenne.testdo.generated.GeneratedF2"
clientClassName="test.client.GeneratedF2" dbEntityName="GENERATED_F2"
superClassName="org.apache.cayenne.CayenneDataObject"
clientSuperClassName="org.apache.cayenne.PersistentObject"/>
+ <obj-entity name="GeneratedReflexive"
className="org.apache.cayenne.testdo.generated.GeneratedReflexive"
clientClassName="test.client.GeneratedReflexive"
dbEntityName="GENERATED_REFLEXIVE"
superClassName="org.apache.cayenne.CayenneDataObject"
clientSuperClassName="org.apache.cayenne.PersistentObject">
+ <obj-attribute name="name" type="java.lang.String"
db-attribute-path="NAME"/>
+ </obj-entity>
<db-relationship name="toMaster" source="GENERATED_COLUMN_COMP_KEY"
target="GENERATED_COLUMN_COMP_M">
<db-attribute-pair source="PROPAGATED_PK" target="ID"/>
</db-relationship>
@@ -82,10 +90,14 @@
<db-relationship name="f2" source="GENERATED_JOIN"
target="GENERATED_F2">
<db-attribute-pair source="ID2" target="ID"/>
</db-relationship>
+ <db-relationship name="next" source="GENERATED_REFLEXIVE"
target="GENERATED_REFLEXIVE">
+ <db-attribute-pair source="REF_ID" target="ID"/>
+ </db-relationship>
<obj-relationship name="toMaster" source="GeneratedColumnCompKey"
target="GeneratedColumnCompMaster" db-relationship-path="toMaster"/>
<obj-relationship name="toDetail" source="GeneratedColumnCompMaster"
target="GeneratedColumnCompKey" db-relationship-path="toDetail"/>
<obj-relationship name="toMaster" source="GeneratedColumnDep"
target="GeneratedColumnTestEntity" db-relationship-path="toMaster"/>
<obj-relationship name="toDep" source="GeneratedColumnTestEntity"
target="GeneratedColumnDep" db-relationship-path="toDep"/>
<obj-relationship name="f2" source="GeneratedF1" target="GeneratedF2"
deleteRule="Nullify" db-relationship-path="join.f2"/>
<obj-relationship name="f1" source="GeneratedF2" target="GeneratedF1"
deleteRule="Nullify" db-relationship-path="join.f1"/>
+ <obj-relationship name="next" source="GeneratedReflexive"
target="GeneratedReflexive" deleteRule="Nullify" db-relationship-path="next"/>
</data-map>