Hibernate - ограничивает загрузку коллекций до одного стола - PullRequest
0 голосов
/ 30 марта 2012

У меня есть, например, БД со следующей структурой сущности и отношения:

[Персона] имеет много [Навыков], [Навыки] имеет много [Действия]

В .hbm.xml я назначаю отношения один-ко-многим для человека> навыки, навыки> действия.

В запросе я хотел бы иметь возможность контролировать, когда я запрашиваю Person, чтобы загружать только Навыки. В настоящее время я, похоже, застрял там, где мне не терпится загружать НИЧЕГО и генерировать n + 1 количество запросов для получения навыков человека или генерировать (n * n + 1) количество запросов, так как он с готовностью загружает все Человек> Навыки> Иерархия коллекции действий.

Как бы я ограничил это так, чтобы я мог контролировать, когда я делаю и не хочу загружать третью таблицу глубины? Для контекста я мог бы жить с всегда инициализированной коллекцией Person> Skills, в идеале как JOIN для предотвращения n + 1 узких мест производительности.

Ответы [ 3 ]

0 голосов
/ 01 апреля 2012

Это немного не по теме, но вы можете рассмотреть вариант использования базы данных Graph для поддержки данных такого уровня сложности вместо RDBMS и Hiberante.См. neo4j , графовую базу данных, которая позволяет создавать узлы (в вашем случае люди, навыки) и отношения между ними (расширяет, знает).Таким образом, вы сможете легко просматривать данные на любом глубоком уровне.

0 голосов
/ 05 мая 2012

Это оказалось довольно легко контролировать во время выполнения.

В моих файлах .hbm.xml я продолжал объявлять наборы ассоциаций ленивыми (даже очень ленивыми!).

В запросе HQL я запрашиваю:

Select distinct p from Person

left join fetch p.skills

ключевое слово fetch вынуждает загружать именно это соединение.

0 голосов
/ 30 марта 2012

Я использую следующую практику:

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

Если у меня есть дочерние коллекции, я всегда устанавливаю, что коллекции загружаются с отложенной загрузкой.

Для запроса, используя API Критерии, у меня есть класс, который создает запрос, выполняет его и возвращает результат. В качестве части построения запроса я использую root.fetch(Person_.skills);, где root равен javax.persistence.criteria.Root<Person>, для активной загрузки нужных мне коллекций.

...