У меня есть некоторые трудности с Spring и Hibernate и ленивая загрузка. Есть много вопросов и ответов, но не совсем то, что я ищу.Hibernate Spring JPA нагрузка только конкретные ленивые отношения
Так что скажем, у меня есть класс . С id
, name
и от одного до многих отношений с doors
, windows
и wheels
. Поскольку они являются oneToMany, они по умолчанию ленивы загружаются, что является предпочтительным, потому что, когда я хочу посмотреть имя car
, я не хочу видеть шины и прочее. Это работает в моем случае, используя методы findOne()
моих репозиториев.
Но когда я хочу посмотреть давление в шинах, мне нужно инициализировать отношения tires
. Раньше я делал это с Hibernate.initialize(car.getTires())
. Это вызывает другой запрос SELECT
для базы данных. Теперь я хочу улучшить свои запросы к базе данных и выбрать только car
с tires
, но оставьте windows
и doors
. (Что возможно в MySQL с объединениями). Возможность заставить их загружать нетерпимость не может быть и речи, потому что я не всегда хочу загрузить связь tires
(у меня есть некоторые большие отношения на моих объектах).
Я попробовал следующий подход:
@Query("SELECT c FROM Car c JOIN FETCH c.tires WHERE c.id = :id")
Car findOneWithTiresLoaded(@Param("id") Long id);
Это обеспечит правильные данные. Но после анализа объекта, возвращенного из репозитория, я заметил, что все отношения загружены. Таким образом, это не только возвращает car
с отношением tires
, но также и doors
и windows
. Ниже дает мне тот же результат (с соотношением moneToMany загруженного)
@Query("SELECT c FROM Car c WHERE id = :id")
Car findOneWithTiresLoaded(@Param("id") Long id);
Что-то, что не хотело. Я ожидал, что это приведет только к объекту Car
без всех его ленивых отношений.
Также предлагается людьми в Интернете, чтобы позвонить по телефону Car.getTires().size()
. Который также произведет еще один запрос SELECT
.
Есть ли способ просто выбрать Car
только с грузом Tires
? Без fetch = FetchType.LAZY
, Hibernate.initialize()
или size()
метод? Как невозможно просто присоединиться к одной таблице? Кроме того, я не использую XML для любой конфигурации.
Спасибо!
мне нужно аннотировать Entity с '@ Table' аннотацию делать? Поскольку мы не делаем этого прямо сейчас, и если его не нужно, было бы чище не писать его. Или он используется с графами объектов? Я попробую это сейчас. Я буду отмечать ваш ответ как решение, если это сработает для нас. Спасибо за ответ! – Clemenz
Отсутствие '@ Table' может быть опущено, я просто использовал его для определения объектов. – Vaelyr
Я только что открыл класс 'Car' расширяет класс' Vehicle'. И поэтому он использует аннотации '@ Inheritance'. (Также аннотация @DiscriminatorValue ('автомобиль'). Когда я пытаюсь использовать именованный график в элементе 'Car', он вызывает ошибку при загрузке. 'Невозможно найти атрибут с заданным именем [Tires] в этом ManagedType [com.example.domain.Vehicle]'. Но я запрашиваю таблицу 'Car' в репозитории' Car'. Что может быть причиной этого? – Clemenz