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 7365715b5 CAY-2552 fix bug with flattened attributes
     new 2965b9a0c Merge pull request #556 from 
aperaverzeu/4.3-FEATURE-CAY-2552-ColumnQuery-bug-with-flattened-attribute
7365715b5 is described below

commit 7365715b5b2bb37fb6007ca765135225995ba06c
Author: Aliaksei Peraverzeu <dev.mroja...@gmail.com>
AuthorDate: Fri Dec 30 13:49:57 2022 +0300

    CAY-2552 fix bug with flattened attributes
---
 .../select/DescriptorColumnExtractor.java          |  17 ++-
 .../access/DataContextFlattenedAttributesIT.java   | 147 ++++++++++++++++++++-
 .../cayenne/access/VerticalInheritanceIT.java      | 109 ++++++++++++++-
 .../select/DescriptorColumnExtractorIT.java        |  83 ++++++++++++
 .../map/DefaultEntityResultSegmentTest.java        |  54 ++++++++
 .../testdo/inheritance_vertical/auto/_Iv1Root.java |   6 +-
 .../testdo/inheritance_vertical/auto/_Iv1Sub1.java |   6 +-
 .../testdo/inheritance_vertical/auto/_Iv2Root.java |   6 +-
 .../testdo/inheritance_vertical/auto/_Iv2Sub1.java |   5 +-
 .../testdo/inheritance_vertical/auto/_Iv2X.java    |   7 +-
 .../inheritance_vertical/auto/_IvAbstract.java     |   6 +-
 .../testdo/inheritance_vertical/auto/_IvBase.java  |   6 +-
 .../inheritance_vertical/auto/_IvBaseWithLock.java |   6 +-
 .../inheritance_vertical/auto/_IvConcrete.java     |   4 +-
 .../inheritance_vertical/auto/_IvGenKeyRoot.java   |   6 +-
 .../inheritance_vertical/auto/_IvGenKeySub.java    |   7 +-
 .../testdo/inheritance_vertical/auto/_IvImpl.java  |   5 +-
 .../inheritance_vertical/auto/_IvImplWithLock.java |   5 +-
 .../testdo/inheritance_vertical/auto/_IvOther.java |   6 +-
 .../testdo/inheritance_vertical/auto/_IvRoot.java  |   6 +-
 .../testdo/inheritance_vertical/auto/_IvSub1.java  |  26 +++-
 .../inheritance_vertical/auto/_IvSub1Sub1.java     |   6 +-
 .../testdo/inheritance_vertical/auto/_IvSub2.java  |   6 +-
 .../testdo/inheritance_vertical/auto/_IvSub3.java  |   5 +-
 .../test/resources/inheritance-vertical.map.xml    |   4 +
 25 files changed, 514 insertions(+), 30 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
index 7f8025976..0ecd53fe4 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
@@ -118,9 +118,16 @@ class DescriptorColumnExtractor extends 
BaseColumnExtractor implements PropertyV
         int count = result.getDbAttributes().size();
         for(int i=0; i<count; i++) {
             ResultNodeDescriptor resultNodeDescriptor = 
processTranslationResult(result, i);
-            if(resultNodeDescriptor != null && i == count - 1) {
+            if(resultNodeDescriptor != null) {
                 resultNodeDescriptor.setJavaType(oa.getType());
-                addEntityResultField(oa.getDbAttribute());
+                if (result.getDbAttributes().size() >= 2) {
+                    DbAttribute dbAttribute = result.getDbAttributes().get(i);
+                    String dataRowKey = result.getAttributePaths().get(i) + 
"." + dbAttribute.getName();
+                    resultNodeDescriptor.setDataRowKey(dataRowKey);
+                    addEntityResultField(dataRowKey);
+                } else {
+                    addEntityResultField(result.getDbAttributes().get(i));
+                }
             }
         }
 
@@ -177,6 +184,12 @@ class DescriptorColumnExtractor extends 
BaseColumnExtractor implements PropertyV
         }
     }
 
+    private void addEntityResultField(String nameForFlattenedAttribute) {
+        if (context.getQuery().needsResultSetMapping()) {
+            entityResult.addDbField(nameForFlattenedAttribute, 
nameForFlattenedAttribute);
+        }
+    }
+
     @Override
     public boolean visitToMany(ToManyProperty property) {
         return true;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
index adb152b79..4ec42b608 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
@@ -22,8 +22,11 @@ package org.apache.cayenne.access;
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.access.translator.select.DefaultSelectTranslator;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DefaultEntityResultSegment;
+import org.apache.cayenne.query.ColumnSelect;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SelectById;
@@ -37,6 +40,7 @@ import org.apache.cayenne.testdo.testmap.Gallery;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.ServerCase;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.math.BigDecimal;
@@ -61,11 +65,17 @@ public class DataContextFlattenedAttributesIT extends 
ServerCase {
     @Inject
     private DBHelper dbHelper;
 
-    private void createTestDataSet() throws Exception {
-        TableHelper tArtist = new TableHelper(dbHelper, "ARTIST");
+    private TableHelper tArtist;
+    private TableHelper tPainting;
+    private TableHelper tPaintingInfo;
+    private TableHelper tGallery;
+
+    @Before
+    public void createTestDataSetStructure() {
+        tArtist = new TableHelper(dbHelper, "ARTIST");
         tArtist.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
 
-        TableHelper tPainting = new TableHelper(dbHelper, "PAINTING");
+        tPainting = new TableHelper(dbHelper, "PAINTING");
         tPainting.setColumns(
                 "PAINTING_ID",
                 "PAINTING_TITLE",
@@ -78,12 +88,14 @@ public class DataContextFlattenedAttributesIT extends 
ServerCase {
                 Types.DECIMAL,
                 Types.INTEGER);
 
-        TableHelper tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO");
+        tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO");
         tPaintingInfo.setColumns("PAINTING_ID", "TEXT_REVIEW");
 
-        TableHelper tGallery = new TableHelper(dbHelper, "GALLERY");
+        tGallery = new TableHelper(dbHelper, "GALLERY");
         tGallery.setColumns("GALLERY_ID", "GALLERY_NAME");
+    }
 
+    private void createTestDataSet() throws Exception {
         long dateBase = System.currentTimeMillis();
         for (int i = 1; i <= 4; i++) {
             tArtist.insert(i + 1, "artist" + i, new java.sql.Date(dateBase
@@ -193,6 +205,115 @@ public class DataContextFlattenedAttributesIT extends 
ServerCase {
         assertNotNull(objects);
     }
 
+    @Test
+    public void testColumnQueryWithFlattenedAttribute() throws Exception {
+        createTestDataSet();
+        ColumnSelect<Object[]> originalQuery = 
ObjectSelect.query(CompoundPaintingLongNames.class)
+                .columns(CompoundPaintingLongNames.SELF);
+
+        DataNode dataNode = 
context.getParentDataDomain().getDataNodes().iterator().next();
+        DefaultSelectTranslator translator =
+                new DefaultSelectTranslator(originalQuery, 
dataNode.getAdapter(), context.getEntityResolver());
+
+        translator.getSql();
+
+        DefaultEntityResultSegment segment = (DefaultEntityResultSegment) 
originalQuery
+                .getMetaData(context.getEntityResolver())
+                .getResultSetMapping()
+                .get(0);
+
+        assertEquals(12, segment.getFields().size());
+        assertEquals(12, translator.getResultColumns().length);
+        assertEquals(segment.getFields().size(), 
translator.getResultColumns().length);
+    }
+
+    @Test
+    public void testSelectColumnQuery() throws Exception {
+        createTestDataWithDeletion();
+
+        ColumnSelect<CompoundPaintingLongNames> originalQuery = 
ObjectSelect.query(CompoundPaintingLongNames.class)
+                .column(CompoundPaintingLongNames.SELF);
+
+        CompoundPaintingLongNames beforeCompoundPainting = originalQuery
+                .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+                .selectOne(context);
+
+        String beforeArtistNameFromContext = 
beforeCompoundPainting.getArtistLongName();
+        String beforePaintingTitleFromContext = 
beforeCompoundPainting.getPaintingTitle();
+
+        String beforeArtistNameFromDatabase = (String) 
tArtist.selectAll().get(0)[1];
+        String beforePaintingTitleFromDatabase = (String) 
tPainting.selectAll().get(0)[1];
+
+        assertNotNull(beforeArtistNameFromDatabase);
+        assertNotNull(beforePaintingTitleFromDatabase);
+
+        assertEquals(beforeArtistNameFromDatabase.trim(), 
beforeArtistNameFromContext);
+        assertEquals(beforePaintingTitleFromDatabase.trim(), 
beforePaintingTitleFromContext);
+
+        beforeCompoundPainting.setArtistLongName("some");
+        beforeCompoundPainting.setPaintingTitle("omes");
+        context.commitChanges();
+
+        CompoundPaintingLongNames afterCompoundPainting = originalQuery
+                .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+                .selectOne(context);
+
+        String afterArtistNameFromContext = 
afterCompoundPainting.getArtistLongName();
+        String afterPaintingTitleFromContext = 
afterCompoundPainting.getPaintingTitle();
+
+        String afterArtistNameFromDatabase = (String) 
tArtist.selectAll().get(0)[1];
+        String afterPaintingTitleFromDatabase = (String) 
tPainting.selectAll().get(0)[1];
+
+        assertNotNull(afterArtistNameFromDatabase);
+        assertNotNull(afterPaintingTitleFromDatabase);
+
+        assertEquals((afterArtistNameFromDatabase).trim(), 
afterArtistNameFromContext);
+        assertEquals((afterPaintingTitleFromDatabase).trim(), 
afterPaintingTitleFromContext);
+    }
+
+    @Test
+    public void testObjectSelectQuery() throws Exception {
+        createTestDataWithDeletion();
+
+        ObjectSelect<CompoundPaintingLongNames> originalQuery = 
ObjectSelect.query(CompoundPaintingLongNames.class);
+
+        CompoundPaintingLongNames beforeCompoundPainting = originalQuery
+                .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+                .selectOne(context);
+
+        String beforeArtistNameFromContext = 
beforeCompoundPainting.getArtistLongName();
+        String beforePaintingTitleFromContext = 
beforeCompoundPainting.getPaintingTitle();
+
+        String beforeArtistNameFromDatabase = (String) 
tArtist.selectAll().get(0)[1];
+        String beforePaintingTitleFromDatabase = (String) 
tPainting.selectAll().get(0)[1];
+
+        assertNotNull(beforeArtistNameFromDatabase);
+        assertNotNull(beforePaintingTitleFromDatabase);
+
+        assertEquals(beforeArtistNameFromDatabase.trim(), 
beforeArtistNameFromContext);
+        assertEquals(beforePaintingTitleFromDatabase.trim(), 
beforePaintingTitleFromContext);
+
+        beforeCompoundPainting.setArtistLongName("some");
+        beforeCompoundPainting.setPaintingTitle("omes");
+        context.commitChanges();
+
+        CompoundPaintingLongNames afterCompoundPainting = originalQuery
+                .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+                .selectOne(context);
+
+        String afterArtistNameFromContext = 
afterCompoundPainting.getArtistLongName();
+        String afterPaintingTitleFromContext = 
afterCompoundPainting.getPaintingTitle();
+
+        String afterArtistNameFromDatabase = (String) 
tArtist.selectAll().get(0)[1];
+        String afterPaintingTitleFromDatabase = (String) 
tPainting.selectAll().get(0)[1];
+
+        assertNotNull(afterArtistNameFromDatabase);
+        assertNotNull(afterPaintingTitleFromDatabase);
+
+        assertEquals(afterArtistNameFromDatabase.trim(), 
afterArtistNameFromContext);
+        assertEquals(afterPaintingTitleFromDatabase.trim(), 
afterPaintingTitleFromContext);
+    }
+
     @Test
     public void testSelectEJQBQL() throws Exception {
         createTestDataSet();
@@ -423,4 +544,20 @@ public class DataContextFlattenedAttributesIT extends 
ServerCase {
             assertEquals("TX1", o3.getTextReview());
         }
     }
+
+    /**
+     * Guarantee initial structure of database via deletion all data inside
+     */
+    private void createTestDataWithDeletion() throws Exception {
+        tPaintingInfo.deleteAll();
+        tPainting.deleteAll();
+        tGallery.deleteAll();
+        tArtist.deleteAll();
+
+        long dateBase = System.currentTimeMillis();
+        tArtist.insert(1, "artist1", new java.sql.Date(dateBase + 1000 * 60 * 
60 * 24));
+        tGallery.insert(1, "gallery1");
+        tPainting.insert(1, "painting1", 1, new BigDecimal("1000"), 1);
+        tPaintingInfo.insert(1, "painting review1");
+    }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
index 7bcbff3ea..645a3f68b 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
@@ -22,6 +22,7 @@ import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ColumnSelect;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SelectById;
@@ -262,14 +263,15 @@ public class VerticalInheritanceIT extends ServerCase {
                ivRootTable.setColumns("ID", "NAME", "DISCRIMINATOR");
 
                TableHelper ivSub1Table = new TableHelper(dbHelper, "IV_SUB1");
-               ivSub1Table.setColumns("ID", "SUB1_NAME");
+               ivSub1Table.setColumns("ID", "SUB1_NAME", "SUB1_PRICE");
 
                TableHelper ivSub1Sub1Table = new TableHelper(dbHelper, 
"IV_SUB1_SUB1");
-               ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME");
+               ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME", 
"SUB1_SUB1_PRICE");
 
                IvSub1Sub1 sub1Sub1 = context.newObject(IvSub1Sub1.class);
                sub1Sub1.setName("XyZN");
                sub1Sub1.setSub1Name("mDA");
+               sub1Sub1.setPrice(42.0);
                sub1Sub1.setSub1Sub1Name("3DQa");
                sub1Sub1.getObjectContext().commitChanges();
 
@@ -285,14 +287,16 @@ public class VerticalInheritanceIT extends ServerCase {
                assertEquals("IvSub1Sub1", data[2]);
 
                Object[] subdata = ivSub1Table.select();
-               assertEquals(2, subdata.length);
+               assertEquals(3, subdata.length);
                assertEquals(data[0], subdata[0]);
                assertEquals("mDA", subdata[1]);
+               assertNull(subdata[2]);
 
                Object[] subsubdata = ivSub1Sub1Table.select();
-               assertEquals(2, subsubdata.length);
+               assertEquals(3, subsubdata.length);
                assertEquals(data[0], subsubdata[0]);
                assertEquals("3DQa", subsubdata[1]);
+               assertNull(subdata[2]);
        }
 
     @Test
@@ -748,4 +752,101 @@ public class VerticalInheritanceIT extends ServerCase {
 
                assertTrue(Cayenne.intPKForObject(sub) > 0);
        }
+
+       @Test
+       public void testColumnSelectVerticalInheritance_Sub1() throws 
SQLException {
+               TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
+               ivRootTable.setColumns("ID", "NAME", "DISCRIMINATOR");
+
+               TableHelper ivSub1Table = new TableHelper(dbHelper, "IV_SUB1");
+               ivSub1Table.setColumns("ID", "SUB1_NAME", "SUB1_PRICE");
+
+               TableHelper ivSub1Sub1Table = new TableHelper(dbHelper, 
"IV_SUB1_SUB1");
+               ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME", 
"SUB1_SUB1_PRICE");
+
+               IvSub1Sub1 sub1Sub1 = context.newObject(IvSub1Sub1.class);
+               sub1Sub1.setName("XyZN");
+               sub1Sub1.setSub1Name("mDA");
+               sub1Sub1.setPrice(42.0);
+               sub1Sub1.setSub1Sub1Name("3DQa");
+               sub1Sub1.getObjectContext().commitChanges();
+
+               assertEquals(1, ivRootTable.getRowCount());
+               assertEquals(1, ivSub1Table.getRowCount());
+               assertEquals(1, ivSub1Sub1Table.getRowCount());
+
+               Object[] data = ivRootTable.select();
+               assertEquals(3, data.length);
+               assertTrue(data[0] instanceof Number);
+               assertTrue(((Number) data[0]).intValue() > 0);
+               assertEquals("XyZN", data[1]);
+               assertEquals("IvSub1Sub1", data[2]);
+
+               Object[] subdata = ivSub1Table.select();
+               assertEquals(3, subdata.length);
+               assertEquals(data[0], subdata[0]);
+               assertEquals("mDA", subdata[1]);
+
+               Object[] subsubdata = ivSub1Sub1Table.select();
+               assertEquals(3, subsubdata.length);
+               assertEquals(data[0], subsubdata[0]);
+               assertEquals("3DQa", subsubdata[1]);
+
+               ColumnSelect<IvSub1> originalQueryForSub1 = 
ObjectSelect.query(IvSub1.class)
+                               .column(IvSub1.SELF);
+
+               IvSub1 result = originalQueryForSub1.selectOne(context);
+               assertEquals("XyZN", result.getName());
+               assertEquals(Double.valueOf(42.0), result.getPrice());
+               assertEquals("mDA", result.getSub1Name());
+       }
+
+       @Test
+       public void testColumnSelectVerticalInheritance_Sub1Sub1() throws 
SQLException {
+               TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
+               ivRootTable.setColumns("ID", "NAME", "DISCRIMINATOR");
+
+               TableHelper ivSub1Table = new TableHelper(dbHelper, "IV_SUB1");
+               ivSub1Table.setColumns("ID", "SUB1_NAME", "SUB1_PRICE");
+
+               TableHelper ivSub1Sub1Table = new TableHelper(dbHelper, 
"IV_SUB1_SUB1");
+               ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME", 
"SUB1_SUB1_PRICE");
+
+               IvSub1Sub1 sub1Sub1 = context.newObject(IvSub1Sub1.class);
+               sub1Sub1.setName("XyZN");
+               sub1Sub1.setSub1Name("mDA");
+               sub1Sub1.setPrice(42.0);
+               sub1Sub1.setSub1Sub1Name("3DQa");
+               sub1Sub1.getObjectContext().commitChanges();
+
+               assertEquals(1, ivRootTable.getRowCount());
+               assertEquals(1, ivSub1Table.getRowCount());
+               assertEquals(1, ivSub1Sub1Table.getRowCount());
+
+               Object[] data = ivRootTable.select();
+               assertEquals(3, data.length);
+               assertTrue(data[0] instanceof Number);
+               assertTrue(((Number) data[0]).intValue() > 0);
+               assertEquals("XyZN", data[1]);
+               assertEquals("IvSub1Sub1", data[2]);
+
+               Object[] subdata = ivSub1Table.select();
+               assertEquals(3, subdata.length);
+               assertEquals(data[0], subdata[0]);
+               assertEquals("mDA", subdata[1]);
+
+               Object[] subsubdata = ivSub1Sub1Table.select();
+               assertEquals(3, subsubdata.length);
+               assertEquals(data[0], subsubdata[0]);
+               assertEquals("3DQa", subsubdata[1]);
+
+               ColumnSelect<IvSub1Sub1> originalQueryForSub1Sub1 = 
ObjectSelect.query(IvSub1Sub1.class)
+                               .column(IvSub1Sub1.SELF);
+
+               IvSub1Sub1 result = originalQueryForSub1Sub1.selectOne(context);
+               assertEquals("XyZN", result.getName());
+               assertEquals(Double.valueOf(42.0), result.getPrice());
+               assertEquals("mDA", result.getSub1Name());
+               assertEquals("3DQa", result.getSub1Sub1Name());
+       }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
new file mode 100644
index 000000000..ff76c4c04
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
@@ -0,0 +1,83 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.access.translator.select;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.ObjectSelect;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.testdo.testmap.CompoundPaintingLongNames;
+import org.apache.cayenne.unit.di.server.CayenneProjects;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
+public class DescriptorColumnExtractorIT extends ServerCase {
+    @Inject
+    private ObjectContext context;
+
+    private final List<String> expectedFlattenedDbFields = List.of(
+            "toArtist.ARTIST_ID",
+            "toArtist.ARTIST_NAME",
+            "toGallery.GALLERY_ID",
+            "toGallery.GALLERY_NAME",
+            "toPaintingInfo.PAINTING_ID",
+            "toPaintingInfo.TEXT_REVIEW");
+
+    @Test
+    public void testEntityResultAddDbFieldsForFlattenedAttributes() {
+
+        EntityResolver resolver = context.getEntityResolver();
+        ClassDescriptor classDescriptor = 
resolver.getClassDescriptor("CompoundPaintingLongNames");
+
+        TranslatorContext translatorContext = new TranslatorContext(
+                new 
FluentSelectWrapper(ObjectSelect.query(CompoundPaintingLongNames.class)
+                        .column(CompoundPaintingLongNames.SELF)),
+                Mockito.mock(DbAdapter.class),
+                resolver,
+                null);
+
+        DescriptorColumnExtractor descriptor = new 
DescriptorColumnExtractor(translatorContext, classDescriptor);
+        descriptor.extract();
+
+        List<String> actualFlattenedDbFields = 
translatorContext.getRootEntityResult()
+                .getDbFields(resolver)
+                .keySet()
+                .stream()
+                .filter(key -> key.startsWith("to"))
+                .sorted()
+                .collect(Collectors.toList());
+
+        assertEquals(expectedFlattenedDbFields.get(0), 
actualFlattenedDbFields.get(0));
+        assertEquals(expectedFlattenedDbFields.get(1), 
actualFlattenedDbFields.get(1));
+        assertEquals(expectedFlattenedDbFields.get(2), 
actualFlattenedDbFields.get(2));
+        assertEquals(expectedFlattenedDbFields.get(3), 
actualFlattenedDbFields.get(3));
+        assertEquals(expectedFlattenedDbFields.get(4), 
actualFlattenedDbFields.get(4));
+        assertEquals(expectedFlattenedDbFields.get(5), 
actualFlattenedDbFields.get(5));
+    }
+}
\ No newline at end of file
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
new file mode 100644
index 000000000..317b63c71
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
@@ -0,0 +1,54 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.reflect.PersistentDescriptor;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static org.junit.Assert.assertEquals;
+
+public class DefaultEntityResultSegmentTest {
+    private final List<String> expectedColumnPath = List.of("key1", "key2");
+
+    private final Map<String, String> fields =
+            new ConcurrentHashMap<>(Map.of("key1", "value1", "key2", 
"value2"));
+
+    private final DefaultEntityResultSegment resultSegment =
+            new DefaultEntityResultSegment(new PersistentDescriptor(), fields, 
fields.size());
+
+    @Test
+    public void testGetColumnPath() {
+        List<String> actualColumnPath = fields.values()
+                .stream()
+                .map(resultSegment::getColumnPath)
+                .collect(Collectors.toList());
+
+        assertEquals(expectedColumnPath.size(), actualColumnPath.size());
+
+        IntStream.range(0, actualColumnPath.size())
+                .forEach(i -> assertEquals(expectedColumnPath.get(i), 
actualColumnPath.get(i)));
+    }
+
+}
\ No newline at end of file
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
index ca063539d..51f57bdbc 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.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.inheritance_vertical.Iv1Root;
 
 /**
  * Class _Iv1Root was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _Iv1Root extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<Iv1Root> SELF = 
PropertyFactory.createSelf(Iv1Root.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
index 18f538111..e63f47dae 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
@@ -4,9 +4,11 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+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.inheritance_vertical.Iv1Root;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv1Sub1;
 
 /**
  * Class _Iv1Sub1 was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.Iv1Root;
  */
 public abstract class _Iv1Sub1 extends Iv1Root {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<Iv1Sub1> SELF = 
PropertyFactory.createSelf(Iv1Sub1.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
index 97d5e0c10..349d7cba4 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.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.inheritance_vertical.Iv2Root;
 
 /**
  * Class _Iv2Root was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _Iv2Root extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<Iv2Root> SELF = 
PropertyFactory.createSelf(Iv2Root.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
index 7ad3f83ec..a8ec72e20 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
@@ -7,6 +7,7 @@ import java.io.ObjectOutputStream;
 import org.apache.cayenne.exp.property.EntityProperty;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.testdo.inheritance_vertical.Iv2Root;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv2Sub1;
 import org.apache.cayenne.testdo.inheritance_vertical.Iv2X;
 
 /**
@@ -17,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.Iv2X;
  */
 public abstract class _Iv2Sub1 extends Iv2Root {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<Iv2Sub1> SELF = 
PropertyFactory.createSelf(Iv2Sub1.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
index c43ad20ab..f24176cf3 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
@@ -5,6 +5,9 @@ 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.testdo.inheritance_vertical.Iv2X;
 
 /**
  * Class _Iv2X was generated by Cayenne.
@@ -14,7 +17,9 @@ import org.apache.cayenne.BaseDataObject;
  */
 public abstract class _Iv2X extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<Iv2X> SELF = 
PropertyFactory.createSelf(Iv2X.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
index b77509e77..d14cfa395 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.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.inheritance_vertical.IvAbstract;
 
 /**
  * Class _IvAbstract was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _IvAbstract extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvAbstract> SELF = 
PropertyFactory.createSelf(IvAbstract.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
index cd554f207..a8e850f56 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.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.inheritance_vertical.IvBase;
 
 /**
  * Class _IvBase was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _IvBase extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvBase> SELF = 
PropertyFactory.createSelf(IvBase.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
index 601ccde21..052c73a35 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.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.inheritance_vertical.IvBaseWithLock;
 
 /**
  * Class _IvBaseWithLock was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _IvBaseWithLock extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvBaseWithLock> SELF = 
PropertyFactory.createSelf(IvBaseWithLock.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
index 6c479ed68..3f140a568 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
@@ -20,7 +20,9 @@ import 
org.apache.cayenne.testdo.inheritance_vertical.IvConcrete;
  */
 public abstract class _IvConcrete extends IvAbstract {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvConcrete> SELF = 
PropertyFactory.createSelf(IvConcrete.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
index c0c9a0d95..504287ea2 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.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.inheritance_vertical.IvGenKeyRoot;
 
 /**
  * Class _IvGenKeyRoot was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _IvGenKeyRoot extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvGenKeyRoot> SELF = 
PropertyFactory.createSelf(IvGenKeyRoot.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
index 62d534579..7326efe73 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
@@ -4,7 +4,10 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+import org.apache.cayenne.exp.property.EntityProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.testdo.inheritance_vertical.IvGenKeyRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvGenKeySub;
 
 /**
  * Class _IvGenKeySub was generated by Cayenne.
@@ -14,7 +17,9 @@ import 
org.apache.cayenne.testdo.inheritance_vertical.IvGenKeyRoot;
  */
 public abstract class _IvGenKeySub extends IvGenKeyRoot {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvGenKeySub> SELF = 
PropertyFactory.createSelf(IvGenKeySub.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
index 86ab1abf4..da1ea5578 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
@@ -8,6 +8,7 @@ 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.inheritance_vertical.IvBase;
+import org.apache.cayenne.testdo.inheritance_vertical.IvImpl;
 import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
 
 /**
@@ -18,7 +19,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
  */
 public abstract class _IvImpl extends IvBase {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvImpl> SELF = 
PropertyFactory.createSelf(IvImpl.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
index 19e3e4e76..5eacdf279 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
@@ -8,6 +8,7 @@ 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.inheritance_vertical.IvBaseWithLock;
+import org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
 import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
 
 /**
@@ -18,7 +19,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
  */
 public abstract class _IvImplWithLock extends IvBaseWithLock {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvImplWithLock> SELF = 
PropertyFactory.createSelf(IvImplWithLock.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
index ae8c98b38..c2d0791b1 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
@@ -6,11 +6,13 @@ import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
 import org.apache.cayenne.exp.property.ListProperty;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.exp.property.StringProperty;
 import org.apache.cayenne.testdo.inheritance_vertical.IvImpl;
 import org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
+import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
 
 /**
  * Class _IvOther was generated by Cayenne.
@@ -20,7 +22,9 @@ import 
org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
  */
 public abstract class _IvOther extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvOther> SELF = 
PropertyFactory.createSelf(IvOther.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
index 78277c64e..fb101ac15 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.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.inheritance_vertical.IvRoot;
 
 /**
  * Class _IvRoot was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
  */
 public abstract class _IvRoot extends BaseDataObject {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvRoot> SELF = 
PropertyFactory.createSelf(IvRoot.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
index 8fef82ea4..8d861755f 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
@@ -4,9 +4,12 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+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.inheritance_vertical.IvRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub1;
 
 /**
  * Class _IvSub1 was generated by Cayenne.
@@ -16,15 +19,29 @@ import 
org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
  */
 public abstract class _IvSub1 extends IvRoot {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvSub1> SELF = 
PropertyFactory.createSelf(IvSub1.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
+    public static final NumericProperty<Double> PRICE = 
PropertyFactory.createNumeric("price", Double.class);
     public static final StringProperty<String> SUB1NAME = 
PropertyFactory.createString("sub1Name", String.class);
 
+    protected Double price;
     protected String sub1Name;
 
 
+    public void setPrice(Double price) {
+        beforePropertyWrite("price", this.price, price);
+        this.price = price;
+    }
+
+    public Double getPrice() {
+        beforePropertyRead("price");
+        return this.price;
+    }
+
     public void setSub1Name(String sub1Name) {
         beforePropertyWrite("sub1Name", this.sub1Name, sub1Name);
         this.sub1Name = sub1Name;
@@ -42,6 +59,8 @@ public abstract class _IvSub1 extends IvRoot {
         }
 
         switch(propName) {
+            case "price":
+                return this.price;
             case "sub1Name":
                 return this.sub1Name;
             default:
@@ -56,6 +75,9 @@ public abstract class _IvSub1 extends IvRoot {
         }
 
         switch (propName) {
+            case "price":
+                this.price = (Double)val;
+                break;
             case "sub1Name":
                 this.sub1Name = (String)val;
                 break;
@@ -75,12 +97,14 @@ public abstract class _IvSub1 extends IvRoot {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
+        out.writeObject(this.price);
         out.writeObject(this.sub1Name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
         super.readState(in);
+        this.price = (Double)in.readObject();
         this.sub1Name = (String)in.readObject();
     }
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
index bf6a8b6a4..4a5c6a100 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
@@ -4,9 +4,11 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+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.inheritance_vertical.IvSub1;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub1Sub1;
 
 /**
  * Class _IvSub1Sub1 was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvSub1;
  */
 public abstract class _IvSub1Sub1 extends IvSub1 {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvSub1Sub1> SELF = 
PropertyFactory.createSelf(IvSub1Sub1.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
index 6b133b91a..2da2e503b 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
@@ -4,9 +4,11 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+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.inheritance_vertical.IvRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub2;
 
 /**
  * Class _IvSub2 was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
  */
 public abstract class _IvSub2 extends IvRoot {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvSub2> SELF = 
PropertyFactory.createSelf(IvSub2.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
index 50fdb3053..6d1ba67dd 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
@@ -7,6 +7,7 @@ import java.io.ObjectOutputStream;
 import org.apache.cayenne.exp.property.EntityProperty;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub3;
 
 /**
  * Class _IvSub3 was generated by Cayenne.
@@ -16,7 +17,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
  */
 public abstract class _IvSub3 extends IvRoot {
 
-    private static final long serialVersionUID = 1L; 
+    private static final long serialVersionUID = 1L;
+
+    public static final EntityProperty<IvSub3> SELF = 
PropertyFactory.createSelf(IvSub3.class);
 
     public static final String ID_PK_COLUMN = "ID";
 
diff --git a/cayenne-server/src/test/resources/inheritance-vertical.map.xml 
b/cayenne-server/src/test/resources/inheritance-vertical.map.xml
index cbad1bccb..4cf9f46e9 100644
--- a/cayenne-server/src/test/resources/inheritance-vertical.map.xml
+++ b/cayenne-server/src/test/resources/inheritance-vertical.map.xml
@@ -76,10 +76,12 @@
        <db-entity name="IV_SUB1">
                <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" 
isMandatory="true"/>
                <db-attribute name="SUB1_NAME" type="VARCHAR" length="100"/>
+               <db-attribute name="SUB1_PRICE" type="DOUBLE"/>
        </db-entity>
        <db-entity name="IV_SUB1_SUB1">
                <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" 
isMandatory="true"/>
                <db-attribute name="SUB1_SUB1_NAME" type="VARCHAR" 
length="100"/>
+               <db-attribute name="SUB1_SUB1_PRICE" type="INTEGER"/>
        </db-entity>
        <db-entity name="IV_SUB2">
                <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" 
isMandatory="true"/>
@@ -147,6 +149,7 @@
        </obj-entity>
        <obj-entity name="IvSub1" superEntityName="IvRoot" 
className="org.apache.cayenne.testdo.inheritance_vertical.IvSub1">
                <qualifier><![CDATA[discriminator = "IvSub1"]]></qualifier>
+               <obj-attribute name="price" type="java.lang.Double" 
db-attribute-path="sub1.SUB1_PRICE"/>
                <obj-attribute name="sub1Name" type="java.lang.String" 
db-attribute-path="sub1.SUB1_NAME"/>
                <attribute-override name="discrimiantor" 
db-attribute-path="DISCRIMINATOR"/>
                <attribute-override name="discriminator" 
db-attribute-path="DISCRIMINATOR"/>
@@ -155,6 +158,7 @@
        <obj-entity name="IvSub1Sub1" superEntityName="IvSub1" 
className="org.apache.cayenne.testdo.inheritance_vertical.IvSub1Sub1">
                <qualifier><![CDATA[discriminator = "IvSub1Sub1"]]></qualifier>
                <obj-attribute name="sub1Sub1Name" type="java.lang.String" 
db-attribute-path="sub1.sub1Sub1.SUB1_SUB1_NAME"/>
+               <attribute-override name="price" 
db-attribute-path="sub1.sub1Sub1.SUB1_SUB1_PRICE"/>
                <attribute-override name="sub1Name" 
db-attribute-path="sub1.SUB1_NAME"/>
        </obj-entity>
        <obj-entity name="IvSub2" superEntityName="IvRoot" 
className="org.apache.cayenne.testdo.inheritance_vertical.IvSub2">

Reply via email to