Spring Rest Проекция данных @OneToOne свойство не загружается
У меня есть эти три класса:
@Entity
public class Trip {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Leg> legs;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<TripDetail> details;
/* snip */
}
@Entity
public class TripDetail {
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private CustomComponents customComponents;
/* snip */
}
@Entity
public class CustomComponents {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<CustomComponent> existingComponents;
/* snip */
}
И эта проекция:
@Projection(name = "withUsages", types = { Trip.class })
public interface TripWithUsagesProjection {
List<LegWithUsagesProjection> getLegs();
List<TripDetail> getDetails();
}
Теперь, когда я выполняю GET в своем API-интерфейсе поездок с проекцией, тогда объект customComponents в TripDetail в возвращенном JSOn имеет значение null.
Если я изменю свойство customComponents в TripDetail для быстрой загрузки (fetch=FetchType.EAGER), то получающийся в результате JSON будет корректным (так как он включает встроенные данные customComponents).
Мне нравится понимать, почему это так?
TripDetail имеет множество других свойств, которые не показаны для краткости (некоторые @OneToMany, некоторые BigDecimal, Strings и другие свойства). Это единственный @OneToOne. Почему @OneToOne ведет себя по-другому здесь?
1 ответ
Глядя на этот кусок кода
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private CustomComponents customComponents;
Вы говорите Hibernate загружать пользовательские компоненты LAZY. т.е. он будет загружать свои детали только при необходимости.
Так что, если вы отлаживаете и ищите customComponents, он будет нулевым.
Но далее, когда вы пытаетесь прочитать некоторые данные из CustomComponents, он должен загружать детали customComponents.
Как Hibernate запустит еще один запрос под капотом, говоря
select * from CustomComponents where id = ?
Вот как работает LAZY
Подробнее здесь