Используйте fetch join или EAGER для решения проблемы гибернации с несколькими пакетами?

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

4 ответа

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

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

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

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

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

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

Другие вопросы по тегам