Использовать fetch join или EAGER для решения проблемы гибернации множественных пакетов? - PullRequest
3 голосов
/ 06 декабря 2011

У меня есть класс A, который имеет отношение один-ко-многим с классом B & C. Я установил для fetchType значение EAGER, которое вызывает проблему извлечения нескольких сумок в JPA.Теперь есть два способа решения проблемы, о которой я знаю.Либо я сохраняю тип выборки Eager и меняю их с List на Set, что нормально в моем случае, либо меняю fetchType на «lazy» и использую запрос соединения для EAGER для извлечения отношений.Какой рекомендуемый подход?

Ответы [ 4 ]

3 голосов
/ 06 декабря 2011

«проблема извлечения нескольких сумок в JPA»

Обратите внимание, что это не «проблема извлечения нескольких пакетов в JPA», это специфическая проблема с Hibernate. Другие поставщики JPA не имеют этой проблемы, и JPA полностью позволяет вам иметь несколько отношений EAGER OneToMany.

1 голос
/ 28 сентября 2012

При активном получении коллекции Hibernate по умолчанию "перекрестно соединяет" ваши корневые таблицы и таблицы коллекции. Это может привести к тому, что будут возвращены дублирующиеся корневые элементы, которые вы, возможно, не захотите. Три возможных решения:

  1. не стесняйтесь;
  2. принудительно выбрать выборку (все еще с нетерпением, но без выборки соединения), используя FetchMode.SELECT; или
  3. хеширует результаты в Set. Рекомендуется установить подход, при условии, что вам обязательно нужно приложить указанную коллекцию. Выполнение выборки соединения лучше, чем выборка, даже с дополнительным шагом хэширования, который практически ничего не стоит.
1 голос
/ 06 декабря 2011

Я бы предпочел получить коллекцию (хотя в запросах также существует ограничение на одну выборку, если вы используете hibernate), поскольку изменения в том, что вы иногда хотите перечислить все объекты A, не используя B & C. Лично я в основномиспользуйте списки, так как я хочу отображать коллекции непосредственно в jsf datatables (которые не могут обрабатывать наборы), и я вынужден инициализировать коллекции вручную, читая их в бэкэнде, а не извлекать их, если это больше, чем одна коллекция.

0 голосов
/ 02 октября 2012

Рассмотрите возможность отображения коллекции в виде списка, а не сумки. Это можно сделать, просто добавив @org.hibernate.annotations.IndexColumn или, начиная с JPA 2.0, предпочитая @javax.persistence.OrderColumn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...