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 <stari...@gmail.com>
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>

Reply via email to