Hibernate - Как сделать ассоциации нетерпеливыми (глобально)? - PullRequest
2 голосов
/ 02 августа 2011

Есть ли какой-нибудь простой способ получить все ассоциации большого графа объектов без необходимости их «левого соединения»?Разве я не могу просто сказать Hibernate о том, что по умолчанию нужно выбирать ассоциации?

Ответы [ 4 ]

6 голосов
/ 02 августа 2011

Даже если возможно иметь глобальный lazy=false (Google не показывает его, но это возможно), вы действительно не хотите этого делать.Вы действительно хотите загрузить всю базу данных или граф существенного объекта для каждого запроса?Имейте в виду, как работает hibernate, необходимо создать экземпляр каждого объекта в графе.Он будет медленным и занимать много памяти, и, вероятно, приведет к падению вашего приложения по мере роста ваших данных.

Если вам нужно загрузить большой набор данных, используйте пользовательский запрос hql и извлеките нужные поля изстолы.Избегайте создания объекта.Кроме того, вы можете позволить БД выполнять большую часть тяжелой работы, используя view ;т. е. пусть БД постоянно обновляет виртуальную таблицу динамически, поэтому вам нужно только выбрать одну таблицу с точки зрения веб-приложений.

Другой вариант - переработать ваши взаимодействия, чтобы вам не приходилось делать это впервое место.

5 голосов
/ 02 августа 2011

Вы можете поместить его в тег hibernate-mapping:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">

Но вы не будете довольны этим.

Кстати: нетерпеливо загружается и присоединяетсяПринеси разные понятия !Оба не являются серебряными пулями, чтобы избежать каких-либо проблем.

  • Обычно использование активной загрузки может привести к серьезной проблеме N + 1
  • Обычно использование выборки соединения может привести к значительному умножению результатов..

Используйте оба, где это уместно - и избегайте обоих, если сомневаетесь.


См. Эти связанные сообщения в блоге Ayende Rahien:

1 голос
/ 02 августа 2011

В HQL вам нужно указать, что вы хотите срочно получить ассоциацию.

Независимо от того, как было сказано выше @hvgotcodes, попытка быстрого извлечения всего приводит к проблемам с производительностью.Скорее всего, при попытке сделать это вы будете извлекать большие части БД.

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

1 голос
/ 02 августа 2011

Я также не знаю о глобальном переключателе.Однако управление выборкой с помощью аннотаций работает.

@Proxy(lazy = false)
public class SomeBean {
...
    @ManyToOne(fetch = FetchType.EAGER)
    private OtherBean otherbean;
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...