2009-10-28 2 views
1

мой зимуют объект A имеет объект B, C, и D, как свойства:спящий режим отложенной загрузки

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

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

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

+0

Хотите ли вы А быть извлечена полностью * каждый раз *, или только в определенных случаях? Имейте в виду, что это влияет на производительность. – Yuval

ответ

2

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

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

  1. Хотя сеанс вверх (вы не закрыли его), если вы запрашиваете поля A, они могут быть загружены по запросу. Это необычайно легко и гибко, но может быть неэффективным, если оно вызывает много вызовов в базе данных.
  2. Вы можете создать запрос HQL , чтобы указать, что вы хотите загрузить A, но также и некоторые поля. Используйте FETCH в запросе для этого.
  3. Вы можете сделать то же самое с Критерии 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 
3

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

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

Смежные вопросы