Принудительная загрузка загруженных свойств - PullRequest
24 голосов
/ 14 октября 2010

У меня есть объект Hibernate, свойства которого загружаются лениво. Большинство из этих свойств - это другие объекты Hibernate или PersistentSets.

Теперь я хочу заставить Hibernate загружать эти свойства всего один раз.

Конечно, я мог бы "потрогать" каждое из этих свойств с помощью object.getSite().size(), но, возможно, есть другой способ достичь моей цели.

Ответы [ 7 ]

21 голосов
/ 15 марта 2012

Это старый вопрос, но я также хотел указать на статический метод Hibernate.initialize.

Пример использования:

Person p = sess.createCriteria(Person.class, id);
Hibernate.initialize(p.getChildren());

Теперь дети инициализируются для использования даже после закрытия сеанса.

7 голосов
/ 14 октября 2010

В документации это выглядит так:

Вы можете принудительно вызывать выборку свойств, используя fetch all properties в HQL.

Ссылки

3 голосов
/ 14 октября 2010

Dozer хорошо подходит для такого типа вещей - вы можете попросить Dozer сопоставить объект с другим экземпляром того же класса, и Dozer посетит все объекты, достижимые из текущего объекта.

См. этот ответ на аналогичный вопрос и мой ответ на другой связанный вопрос для получения более подробной информации.

1 голос
/ 02 февраля 2017

3 способа

1.HQL с левым соединением детей

2.SetFetchMode после createCriteria

3.Hibernate.initialize

1 голос
/ 26 июля 2013

Для меня это работает:

Person p = (Parent) sess.get(Person.class, id);
Hibernate.initialize(p.getChildren());

Вместо этого:

Person p = sess.createCriteria(Person.class, id);
Hibernate.initialize(p.getChildren());
0 голосов
/ 08 декабря 2010

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

0 голосов
/ 14 октября 2010

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

<class name="Document">
  <id name="id">
    <generator class="native"/>
  </id>
  <property length="50" name="name" not-null="true"/>
  <property lazy="false" length="200" name="summary" not-null="true"/>
  <property lazy="false" length="2000" name="text" not-null="true"/>
</class>
...