Спящий Ленивая загрузка - PullRequest
       18

Спящий Ленивая загрузка

1 голос
/ 28 октября 2009

мой спящий объект A имеет объекты B, C и D в качестве свойств:

A.getB().getName();  
A.getC().getTitle();

Теперь я хочу загрузить A со всеми его свойствами, не получая LazyInitializationException. Итак, мне нужно полностью загрузить объектный граф А.

существует ли какой-либо универсальный метод получения графа объекта в спящем режиме?

Ответы [ 3 ]

3 голосов
/ 28 октября 2009

Шаблон Открытие сеанса в представлении помогает избежать исключения LazyInitializationException. Также в Seam это делается с помощью с использованием расширенного PersistentManager и области диалога

Другое решение требует извлечения, как в этом примере или ответ KLE.

3 голосов
/ 28 октября 2009

вы можете указать его в файле сопоставления .hbm.xml с атрибутом 'lazy = "false" или указать его в объекте критериев методами createAlias ​​или createCriteria.

Также можно установить fetchMode для критерия для конкретной ассоциации

2 голосов
/ 28 октября 2009

Вероятно, бывают случаи, когда вы хотите загрузить полный граф объектов, и другие, когда вам нужно гораздо меньше данных (и вы не хотите платить за производительность, связанную с загрузкой всего этого). Итак, давайте предположим, что ваши потребности варьируются.

В общем, отложенная загрузка Hibernate, но вы можете загрузить дополнительные данные одним из нескольких способов (подробнее см. Документацию Hibernate):

  1. Пока ваш сеанс завершен (вы не закрыли его), если вы запрашиваете поля A, они могут быть загружены по требованию . Это чрезвычайно просто и гибко, но может быть неэффективно, если выполняется много обращений к базе данных.
  2. Вы можете создать HQL-запрос , чтобы указать, что вы хотите загрузить A, а также некоторые поля. Используйте FETCH в запросе для этого.
  3. Вы можете сделать то же самое с Criteria API. Вместо указания запроса вы выполняете вызовы методов.

Образец для ленивых:

     A a = ...; // load A
     String name = a.getB().getName(); // triggers an implicit query to load B

Образец для HQL:

     select a 
     from A a
     left join a.b b
     left join a.c c
     where a.id = :id
...