Datanucleus / JDO InstanceLifecycleListener для makeTransient (или LOAD по запросу) - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть проблема, которую мне нужно решить, используя DATANUCLEUS (JDO), возможно, ограничение чего-то, что не было охвачено JDO спецификациями.

Iнужно ловить, когда объекты загружаются в Query - для этого НЕТ InstanceLifecycleListener !(Запрошенные объекты должны быть обработаны как ЗАГРУЖЕННЫЕ объекты в конце концов - их можно изменить, отсоединить и т. Д.)

Query query=pm.newQuery(...);
Collection col=(Collection)query.execute();

Еще один способ сделать это - перехватывать, когда объекты становятся переходными.Я также не нашел способа сделать это!

pm.makeTransientAll(col,true);

Есть идеи?

Для отдельных элементов запроса я использую DetachLifecycleListener поверх PMF, который слушаетМетод DETACH.Это единственный способ заставить InstanceLifecycleListener работать с запросами.

1 Ответ

0 голосов
/ 27 февраля 2019

Вот что я обнаружил с большим количеством отладки:

1) Запросы НЕ запускают InstanceLifecycleListener (кроме случаев, когда элементы ОТКЛЮЧЕНЫ), если ПО УМОЛЧАНИЮ группа извлечения (иначе METADATA default-fetch-group) УДАЛЕНА из PersistentManager перед запросом.Другими словами: нельзя использовать метод pm.getFetchPlan (). ClearGroups () , или нужно ДОБАВИТЬ группу извлечения DEFAULT перед выполнением запроса.ТАК ... если необходимо определить программную группу выборок, необходимо принять во внимание, что группа выборок DEFAULT будет (должна!) Присутствовать (то есть все поля, определенные в метаданных!) Для InstanceLifecycleListener для работы.

Обходной путь может быть ОПРЕДЕЛИТЬ группу выборки DEFAULT ТОЛЬКО КЛЮЧОМ (это необходимо) и просто изменить логику для работы с этим.Что я сделал точно ... Результат?

2) метод getObjectById ОСТАНОВИТСЯ, вызывая postLoad !!!После отладки я обнаружил, что для того, чтобы это работало, план извлечения DEFAULT ДОЛЖЕН определять другое поле, кроме КЛЮЧЕВОГО!

Существует полное отсутствие информации о том, как влияют группы извлеченияспособ запуска InstanceLifecycleListener, и Apache JDO (по крайней мере) должен пересмотреть способ, которым это работает (или, по крайней мере, DOCS), чтобы пользователи JDO не сходили с ума с реализацией.

...