Как получить глубоко вложенную проблему @ * ToOne предотвращая n + 1 спящий режим - PullRequest
0 голосов
/ 10 января 2019

У меня есть объект A, который содержит отношение @OneToOne к объекту B. Объект B, в свою очередь, имеет отношение @OneToOne к объекту C:

A
| 
|--B  @OneToOne
   |
   |--C   @OneToOne

Мне нужно выбрать все данные Объекта A с некоторыми полями Объекта B. Поля Объекта C следует игнорировать.

Зная, что в Hibernate типом выборки по умолчанию для отношений * ToOne является EADGER, когда getResultList критериев Api вызывается для объекта A, выполняется N + 1 запрос (3 выбора).

Я использую Spring Data JPA с Spring Boot поверх БД Oracle.

Чтобы избежать этой проблемы и выполнить только один запрос, я настроил правильный выбор соединения из объекта A в объект B.

С этой конфигурацией я ожидаю решения проблемы, но я заметил, что hibernate выполняет два выбора, а не один. Он извлекает сущность A и сущность B в один и тот же запрос, как настроено в выборке, но выполняет дополнительный запрос для загрузки C.

Чтобы решить, мне нужно настроить правильный выбор соединения также для Entity C.

Это правильный подход? Я в ужасе, потому что это простой случай, но что происходит в сложном случае, с множеством отношений и вложенных элементов? Есть ли способ игнорировать вложенные отношения?

Я также пытался использовать выборку правого соединения на объекте A в сочетании с @LazyToOne (инструментарий во время компиляции). Но он всегда выполняет два запроса:

Первый, на query.getResultList (), является правильным запросом и правильно извлекает все необходимые данные.

Второй, запускается Hibernate, когда я пытаюсь получить доступ к объекту B с помощью getB (). Этот запрос имеет странное поведение: он получает идентификатор объекта B из объекта A.

Что-то вроде: Выберите b.id из где a. Id =?

Я не знаю, почему он выполняет этот дополнительный запрос!

Как решить элегантно?

Спасибо

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