JPA Annotation ElementCollection готовится к загрузке в весенней загрузке - PullRequest
0 голосов
/ 08 апреля 2020

У меня небольшая проблема с активной загрузкой при весенней загрузке. По сути, у меня есть сущность, определенная как:

@Entity
class EventEntry(
        @ID
        val uid 

        @ElementCollection(fetch = FetchType.EAGER)
        @CollectionTable(name = "event_to_boxes", joinColumns = arrayOf(JoinColumn(name = "event_uid")))
        @Column(name = "box_uid")
        val boxUids: List<Long>
) : EventEntry(userUid, timestamp)

Теперь, когда я вставляю данные (из graphql, но это деталь), все работает нормально, и я вижу, что в базе данных несколько строк правильно сохраняется в таблице event_to_boxes. К сожалению, когда я получаю все события, появляется что-то неожиданное.

Я вижу запрос, запрашивающий все события, затем запрашивающий один раз для каждого списка boxUids, почти как FetchType.EAGER. был полностью проигнорирован.

Насколько я понимаю, тип извлечения должен был уже получить значения для идентификаторов ящиков при заполнении прав на события. Я что-то упустил или мое понимание совершенно неверно?

Чтобы дать немного больше фона, я пытаюсь смоделировать отношения N-N-N таким образом, где это - половина N- отношения, но я должен, при получении сущности события, также вызывать uid коробки (box - это другая половина отношения) без каких-либо дополнительных данных box

1 Ответ

0 голосов
/ 08 апреля 2020

Как объяснено в документации по гибернации , FetchType.EAGER будет работать только для прямой выборки сущностей:

EventEntry eventEntry = entityManager.find(EventEntry.class, 1L);

Предложение LEFT JOIN добавляется к сгенерированный запрос SQL, потому что эта связь должна быть извлечена с нетерпением.

С другой стороны, если вы используете запрос сущности, который не содержит директиву JOIN FETCH ...

Hibernate использует вторичный выбор вместо. Это связано с тем, что политику выборки запросов объекта нельзя переопределить, поэтому Hibernate требует вторичного выбора, чтобы убедиться, что EAGER ассоциация извлекается до возврата результата пользователю.

Если вы забыли JOIN FETCH Для всех EAGER ассоциаций Hibernate собирается выпустить вторичный выбор для каждого из них, что, в свою очередь, может привести к проблемам с запросом N + 1.

По этой причине вы должны предпочесть ассоциации LAZY .

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