Будьте в спящем режиме CollectionOfElements, НЕТЕРПЕЛИВАЯ выборка копирует элементы

Это не сработало для меня в Safari 10:

<input type="file" accept=".csv" />

Я должен был написать это вместо:

<input type="file" accept="text/csv" />
41
задан Rachel 7 July 2009 в 15:49
поделиться

3 ответа

Как правило, не рекомендуется применять активную выборку в сопоставлении - лучше указать активные соединения в соответствующих запросах (если вы не уверены на 100%, что при любых и любых обстоятельствах ваш объект выиграл не имеет смысла / быть действительным без заполнения этой коллекции).

Причина, по которой вы получаете дубликаты, заключается в том, что Hibernate внутренне объединяет вашу корневую таблицу и таблицу сбора. Обратите внимание, что они действительно являются дубликатами, например, для 2 SynonymMapping с 3 элементами коллекции каждый вы получите 6 результатов (2x3), по 3 копии каждого объекта SynonymMapping. Так что самый простой обходной путь - обернуть результаты в Set, чтобы гарантировать их уникальность.

29
ответ дан 27 November 2019 в 00:18
поделиться

Вы можете использовать предложение SELECT DISTINCT (Hibernate Query Language) следующим образом

SELECT DISTINCT synonym FROM SynonymMapping synonym LEFT JOIN FETCH synonym.values

Предложение DISTINCT удаляет повторяющиеся ссылки в Hibernate.

Хотя и компонент, и коллекция типов значений имеют границы жизненного цикла к классу сущности-владельца, вы должны объявить их в предложении select, чтобы получить их. (LEFT JOIN FETCH synonym.values)

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

отношениями

2
ответ дан 27 November 2019 в 00:18
поделиться

Я столкнулся с той же проблемой - когда вы устанавливаете FetchType.EAGER для @CollectionOfElements, Hibernate пытается получить все за один раз, то есть используя один запрос для каждой записи связанного элемента к «главному» объекту. Эта проблема может быть успешно решена за счет N + 1 запроса, если вы добавите аннотацию @Fetch (FetchMode.SELECT) в свою коллекцию. В моем случае я хотел иметь объект MediaObject с коллекцией его элементов метаданных (видеокодек, аудиокодек, размеры и т. Д.). Сопоставление для коллекции metadataItems выглядит следующим образом:


@CollectionOfElements (targetElement = String.class, fetch = FetchType.EAGER)
@JoinTable(name = "mo_metadata_item", joinColumns = @JoinColumn(name = "media_object_id"))
@MapKey(columns = @Column(name = "name"))
@Column (name = "value")
@Fetch (FetchMode.SELECT)
private Map<String, String> metadataItems = new HashMap<String, String>();
68
ответ дан 27 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: