Какова лучшая практика или элегантное решение для ленивой инициализации в JPA? - PullRequest
0 голосов
/ 18 июня 2019

В нашем проекте у нас есть сущность (просто названная как 'X'), которая имеет некоторые ассоциации OneToMany с другими сущностями, например, скажем, Set1, Set2, Set3 и Set4 и т. Д. (Все стратегии выборки - «Ленивые»).У нас есть требование, основанное на различных параметрах URL, которые нам нужны для запроса «X» и загрузки различных связанных объектов, например, иногда нам нужно получить «X» вместе с Set1 и Set2;Иногда нам нужно получить 'X' вместе с Set2 и Set5;Какие связанные объекты должны быть загружены вместе с 'X', определяется параметром URL.

Конечно, мы можем использовать API критериев JPA для динамического запроса 'X' и объединения различных ассоциаций на основе параметров URL для получения правильного результата, но проблема заключается в других ассоциациях, которые не нужны для запросана этот раз ленивая инициализация легко неожиданно запускается где-то после того, как мы передаем нашу сущность «X» обратно на верхний уровень.Мы можем либо получить исключение отложенной инициализации из hibernate из-за отсутствия открытого сеанса в контексте, либо получить N + 1, выбрав проблему производительности.Есть ли способы, с помощью которых я могу сказать JPA или hibernate прекратить отложенную инициализацию после запроса моего объекта «X»?Потому что если это так, я могу безопасно передать «X» на другой уровень, не беспокоясь о ленивой инициализации.

Кто-то сказал бы, что я должен передать «X» в «XDto» сразу после запроса и передать «XDto» на другой уровень, но проблема в том, как мне узнать, какие ассоциации должны быть преобразованы, а какие нет.в логике конвертации Dto?Потому что тогда я должен передать параметры URL в свою логику преобразования Dto, чтобы не касаться ассоциаций, которые не загружены, это выглядит немного уродливо.Я слышал, что в JPA есть постоянная утилита API, которая может использоваться для проверки того, инициализировано ли уже поле ассоциации или нет, прежде чем я попробую это, я хотел бы спросить, есть ли у них какие-либо другие элегантные решения, которые я могу попробовать?Спасибо большое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...