0

我以两种方式与 B、C 和 D 类的对象建立了关系。

所以我可以做(用“a”一个A类型的对象):

B b = a.getB();
A a1 = a.getB().getA(); // and a1 would be equal to a

当我对 A 执行 SelectQuery 并预取从 A 到 B、C 和 D 的关系时,一切都很好。但是如果我在从 B 到 A 的关系上添加预取,那么 A 会失去从 A 到 C 和 D 的关系,或者它什么也不做。我的意思是“输掉”它们已经失效。

这正常吗?为什么会这样?

注意:我使用的是 Cayenne 3.0.2 和不相交的预取语义。

示例 1(如上所述):

SelectQuery query = new SelectQuery(A.class);
query.addPrefetch("b").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
query.addPrefetch("c").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
query.addPrefetch("d").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
query.addPrefetch("b.a").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
List<?> res= context.performQuery(query);

示例 2(这可能是相同的问题):

SelectQuery query = new SelectQuery(A.class);
query.addPrefetch("b").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
query.addPrefetch("c").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
List<?> res= context.performQuery(query);

然后稍后

SelectQuery query = new SelectQuery(A.class);
query.addPrefetch("d").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
List<?> res= context.performQuery(query);

然后与 b 和 c 的关系无效或忽略最后一次预取。有时 b 和 c 会设置为 null,尽管它们不为 null。

谢谢

4

1 回答 1

0

经过一些研究,这似乎是CAY-1695 Jira 中讨论的问题。这是由于主查询和子查询中出现相同的对象,混淆了预取处理代码。该修复程序仅适用于 master(即 3.2),尚未正式发布。因此,获得它的一种方法是从 GitHub 克隆 Cayenne 并进行自己的构建。(但是,如果您遇到麻烦,请联系我,我可以将二进制文件发布到某个地方)。

于 2014-09-22T16:07:06.520 回答