2014-09-18 4 views
0

У меня есть объект класса А в 2 способе отношений с объектами классов В, С и D.Prefetchs с Cayenne

Так что я мог сделать (с «а» объектом типа A):

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

Когда я сделать SelectQuery на а со prefetchs на отношения от а до B, C и D, все нормально. Но если я добавлю предварительную выборку из отношения от B к A, то A потеряет отношения от A до C и D или ничего не делает. Я имею в виду «потерять», что они были признаны недействительными.

Это нормально? Почему это так?

Примечания: Я использую Cayenne 3.0.2 и непересекающуюся семантику prefetchs.

Пример 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, но они не равны нулю.

благодаря

+0

Не могли бы вы отобразить последовательность запросов, которые приводят к этой проблеме? Также я бы рекомендовал проверить его с помощью Cayenne 3.1, который сейчас находится на грани окончательной версии. –

+0

@andrus_a Я только что проверил cayenne 3.1RC1. Это точно так же. Я добавил два примера к моему вопросу, чтобы сделать его более ясным. – Adrien

+0

То же самое с 3.2M1 – Adrien

ответ

0

После некоторых исследований, это, как представляется, проблема обсуждается в CAY-1695 Jira. Он вызван теми же объектами, которые появляются в основном запросе и подзапросах, запутывая код обработки предварительной выборки. Исправление доступно только на master (т. Е. 3.2) и еще официально не выпущено. Таким образом, один из способов получить это - клонировать Cayenne от GitHub и делать свою собственную сборку. (Но скажите мне, если у вас возникнут проблемы с этим, я могу разместить двоичные файлы где-нибудь).

+0

Спасибо, я думаю, что я исправлю это, изменив все двунаправленные отношения на одно направление и внедряя отсутствующие геттеры в нашем приложении. – Adrien

+0

Невозможно переключиться с двухстороннего отношения к односторонним отношениям. Более верный способ обойти это - увидеть, что prefetches не указывают на исходную сущность. –

+0

У меня точно такая же проблема: 'SelectQuery query = new SelectQuery (A.class); query.addPrefetch ("b"). SetSemantics (PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS); query.addPrefetch ("c"). SetSemantics (PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS); Список res = context.performQuery (query); ' then: ' SelectQuery query = new SelectQuery (B.class); query.addPrefetch ("a"). SetSemantics (PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS); Список res = context.performQuery (query); ' – Adrien