Kodo: Как настроить Place Plan для двунаправленных отношений?
Вопрос
Запуск Kodo 4.2 и имея проблему неэффективных запросов, генерируемых Kodo. Это происходит при выходе на объект, который содержит коллекцию, в которой эта коллекция имеет билеты обратно к первому объекту.
Class Classroom
{
List<Student> _students;
}
Class Student
{
Classroom _classroom;
}
Если мы создадим Fetch Plan для получения списка классных комнат и их соответствующих студентов, создавая следующий план Fetch:
fetchplan.adddfield (классная комната .Class, "_ студенты");
Это приведет к двум запросам (получить классные комнаты, а затем заставить всех студентов, которые находятся в этих классах), что мы ожидали.
Однако, если мы включаем ссылку обратно в классную комнату в нашем плане Fetch, в целях наследуемого поля _ClassLOASS, чтобы наследить, делая FetchPlan.adddfield (Student.class, «_Classroom»), это приведет к X количеству дополнительных запросов, где X это количество студентов в каждом классе.
Может кто-нибудь объяснить, как это исправить? Kodo уже имеет оригинальные классные объекты в том, что он выполняет запросы для извлечения объектов классных комнат и установить их в полном поле каждого студента. Поэтому я ожидаю, что Kodo просто установит эти объекты в поле _Classroom на каждом объекте студента соответственно и не вернуться в базу данных.
Еще раз, документация очень не хватает, но от того, что я прочитал, что он сможет сделать это более эффективно.
ПРИМЕЧАНИЕ - EAGER_FETCH.PARALLEL включен, и я пробовал это с кэшированием (запросы и кэширование данных) включено и выключено, и в результирующих запросах нет разницы.
Решение
Работал с поддержкой Oracle на этом - это дефект в Kodo 4.2 (последняя версия). Fix - это полностью выбрать атрибут GUST-GROUP-GROUP (не просто устанавливать его в True или false) из файла метаданных JDO для полей, которые находятся на одной-одной стороне двунаправленных отношений. Таким образом, в приведенном выше примере вы вынесли атрибут Guard-Group Default-Gress для поле Student._Classroom.