Можно ли загрузить объект со всеми ленивыми свойствами без итерации? - PullRequest
1 голос
/ 19 апреля 2011

У меня есть объект, у которого есть дети, некоторые из которых загружены ленивыми, некоторые нет. Теперь у меня есть ситуация, когда мне нужен родительский объект для загрузки со всеми дочерними объектами одновременно. Есть ли быстрый способ сделать это без проверки Hibernate.isInitialized() для всех свойств?

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 апреля 2011

Как вы получаете объект?

Общий подход к этому (его часто называют «увлажнением» объектов) - это запросить выборку соединения.Вот где ORM извлекает данные для дочерних объектов одновременно с данными для родителя, используя соединение, и использует данные для быстрой инициализации дочерних объектов.

Существуют различные способы запроситьприсоединение к выборке, в основном для конкретного поставщика, но вы можете записать его в переносимый JPQL :

select p from Parent p join fetch p.children where ...

Однако обратите внимание, что при этом каждый родитель будет возвращаться несколько раз - столько, сколько у него есть детей,Это немного странно, но это то, как это работает.

0 голосов
/ 21 апреля 2011

Я согласен с Томом, я использую выборочные соединения, чтобы вернуть дочерние объекты, которые я хочу инициализировать. Что касается запроса, возвращающего несколько родительских объектов, я считаю, что добавление предложения «DISTINCT» должно исправить это.

0 голосов
/ 19 апреля 2011

Я бы использовал Hibernate.initialze(..), но вы также можете сериализовать объект (используя ObjectOutputStream или XMLEncoder. Механизм сериализации будет повторять все свойства и они будут инициализированы. Вы можете использовать commons-lang SerializationUtils.

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