Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
3.2.M1
-
None
-
Ubuntu 14.04lts, Java 1.7, Mysql 5.5.37
Description
Use case description:
Cayenne model:
Tables:
Contact
id -primary key
name - string
Course
id - primary key
name - string
Relation
id - primary key
entityIdentifier - entity name of related object
entityId - id of related object
ruleId - id of rule
Rule
id - primary key
name - string
Classes:
Contact
properties: id, name
relations: List< ContactRuleRelation> ruleRelations
Course
properties: id, name
relations: List< CourseRuleRelation > ruleRelations
RuleRelation
properties: id, entityIdentifier
relations: rule
ContactRuleRelation extends RuleRelation
(entityIdentifier = 'Contact')
CourseRuleRelation extends RuleRelation
(entityIdentifier = 'Course')
Rule
properties: id, name
Data in the database:
Contact: id=1, name=Contact1
Course: id=1, name=Course1
Relation: id=1, objectIdentifier=Course, objectID=1, ruleId=1
Rule: id=1, name=Rule1
SelectQuery:
select Contact by id = 1 and add prefetch relations.rule
As result the exception:
java.lang.NullPointerException
at org.apache.cayenne.access.ResultScanParentAttachmentStrategy.indexParents(ResultScanParentAttachmentStrategy.java:104)
at org.apache.cayenne.access.ResultScanParentAttachmentStrategy.linkToParent(ResultScanParentAttachmentStrategy.java:72)
at org.apache.cayenne.access.HierarchicalObjectResolverNode.objectsFromDataRows(HierarchicalObjectResolverNode.java:70)
at org.apache.cayenne.access.HierarchicalObjectResolver$DisjointProcessor.startDisjointPrefetch(HierarchicalObjectResolver.java:121)
at org.apache.cayenne.query.PrefetchTreeNode.traverse(PrefetchTreeNode.java:206)
at org.apache.cayenne.query.PrefetchTreeNode.traverse(PrefetchTreeNode.java:221)
at org.apache.cayenne.query.PrefetchTreeNode.traverse(PrefetchTreeNode.java:221)
at org.apache.cayenne.access.HierarchicalObjectResolver.resolveObjectTree(HierarchicalObjectResolver.java:96)
at org.apache.cayenne.access.HierarchicalObjectResolver.synchronizedRootResultNodeFromDataRows(HierarchicalObjectResolver.java:78)
at org.apache.cayenne.access.DataDomainQueryAction$ObjectConversionStrategy.toResultsTree(DataDomainQueryAction.java:565)
at org.apache.cayenne.access.DataDomainQueryAction$SingleObjectConversionStrategy.convert(DataDomainQueryAction.java:603)
at org.apache.cayenne.access.DataDomainQueryAction.interceptObjectConversion(DataDomainQueryAction.java:459)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:129)
at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:605)
at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:838)
Looks like Cayenne considers only entityId without entityIdentifier when try to load the prefetch.