Предварительная выборка с Cayenne

У меня есть объект класса A двумя способами связи с объектами классов B, C и D.

Итак, я мог бы сделать (с «а» объектом типа А):

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

Когда я делаю SelectQuery для A с предварительной выборкой отношений между 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 устанавливаются равными нулю, хотя они не равны нулю.

Спасибо


person Adrien    schedule 18.09.2014    source источник
comment
Не могли бы вы показать последовательность запросов, которая приводит к этой проблеме? Также я бы порекомендовал проверить это с Cayenne 3.1, который сейчас находится на грани финального релиза.   -  person andrus_a    schedule 19.09.2014
comment
@andrus_a Я только что проверил с cayenne 3.1RC1. Это точно то же самое. Я добавил два примера к моему вопросу, чтобы сделать его более понятным.   -  person Adrien    schedule 19.09.2014


Ответы (1)


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

person andrus_a    schedule 22.09.2014
comment
Спасибо, думаю, я собираюсь исправить это, изменив все двунаправленные отношения на однонаправленные и внедрив недостающие геттеры в наше приложение. - person Adrien; 23.09.2014
comment
Не уверен, что переход от двусторонних отношений к односторонним поможет. Более надежный способ обойти это — убедиться, что предварительная выборка не указывает на исходный объект. - person andrus_a; 23.09.2014
comment
У меня точно такая же проблема с: 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(B.class); query.addPrefetch("a").setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS); List<?> res= context.performQuery(query); - person Adrien; 23.09.2014