[ https://issues.apache.org/jira/browse/CAY-2257?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16967324#comment-16967324 ]
Tomas Jura commented on CAY-2257: --------------------------------- Hi My model is very simple: PRODUCT_CATEGORY – 1:N-- PRODUCT_SUBCATEGORY fetching PRODUCT_SUBCATEGORY as: .prefetch("ProductSubcategories",PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS) do not works (see [^commit_log.txt] showing the lazy fetches.). But fetch as: .prefetch(ProductCategory.PRODUCT_SUBCATEGORIES.joint()) do correctly posts just one select into database. I looked into prefetchTree.addPath(path). You are right, the merge is there. I'm going to run the prefetchTree.addPath under debugger to see what happens. > Prefetch with joint semantics looses data > ----------------------------------------- > > Key: CAY-2257 > URL: https://issues.apache.org/jira/browse/CAY-2257 > Project: Cayenne > Issue Type: Bug > Components: Core Library > Affects Versions: 4.0.M3, 4.0.M5 > Environment: MacOs Sierra, Posgres 9.5.4 > Reporter: Alexei Grigoriev > Assignee: Nikita Timofeev > Priority: Major > Attachments: commit_log.txt > > > Cayenne fails to fill detail collections when master is an abstract class. > So for query > {code:java} > SelectQuery<Master> prefetchSelectQuery = SelectQuery.query(Master.class); > prefetchSelectQuery.addPrefetch("details").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); > {code} > details fetched as expected. > {code:java} > SelectQuery<Master> prefetchSelectQuery = SelectQuery.query(Master.class); > prefetchSelectQuery.addPrefetch("details").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS); > {code} > returns empty collections for details. But log shows that all queries > executed and expected number of rows returned. > for concrete class {code:java}SelectQuery<ConcreteMaster> prefetchSelectQuery > = SelectQuery.query(ConcreteMaster.class);{code} > both cases work as expected > See my model: > {code:xml} > <db-entity name="master"> > <db-attribute name="master_id" type="BIGINT" isPrimaryKey="true" > isMandatory="true"/> > <db-attribute name="type" type="VARCHAR" isMandatory="true" > length="32"/> > </db-entity> > <db-entity name="detail"> > <db-attribute name="detail_id" type="BIGINT" isPrimaryKey="true" > isMandatory="true"/> > <db-attribute name="master_id" type="BIGINT" isMandatory="true"/> > </db-entity> > <obj-entity name="Master" abstract="true" className="model.Master" > lock-type="optimistic" dbEntityName="master"> > <obj-attribute name="type" type="model.enumeration.type.MasterType" > db-attribute-path="type"/> > <obj-entity name="ConcreteMaster" superEntityName="Master" > className="model.ConcreteMaster" lock-type="optimistic"> > <qualifier><![CDATA[type = "CONCRETE_MASTER"]]</qualifier> > </obj-entity> > <obj-entity name="Detail" className="model.Detail" lock-type="optimistic" > dbEntityName="detail"> > <obj-attribute name="masterId" type="java.lang.Long" > db-attribute-path="master_id"/> > </obj-entity> > <db-relationship name="master" source="detail" target="master" toMany="false"> > <db-attribute-pair source="master_id" target="detail_id"/> > </db-relationship> > <db-relationship name="details" source="master" target="detail" toMany="true"> > <db-attribute-pair source="detail_id" target="master_id"/> > </db-relationship> > <obj-relationship name="master" source="Detail" target="Master" > deleteRule="Nullify" db-relationship-path="master"/> > <obj-relationship name="details" source="Master" target="Detail" > deleteRule="Cascade" db-relationship-path="details"/> > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)