Используйте 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 по умолчанию "перекрестно соединяет" ваши корневые таблицы и таблицы коллекции. Это может привести к тому, что будут возвращены дубликаты корневых элементов, которые вы, возможно, не захотите. Три возможных решения:
- не стремись забрать;
- принудительно выбрать выборку (все еще с нетерпением, но без выборки соединения), используя FetchMode.SELECT; или же
- хэшируйте результаты в набор. Рекомендуется установить подход при условии, что вам обязательно нужно приложить указанную коллекцию. Производительность выборки соединения лучше, чем выборочная, даже с дополнительным шагом хэширования, который практически ничего не стоит.
Рассмотрите отображение коллекции как список, а не как мешок. Это делается путем добавления @org.hibernate.annotations.IndexColumn
или, поскольку JPA 2.0, предпочитают @javax.persistence.OrderColumn