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>