У меня есть три класса:
@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 будет нулевым.
Если я изменю свойство customComponents в TripDetail для быстрой загрузки (fetch = FetchType.EAGER), то получающийся в результате JSON будет корректным (поскольку он включает встроенные данные customComponents).
Мне нравится понимать, почему это так?
TripDetail имеет множество других свойств, которые не показаны для краткости (некоторые @OneToMany, некоторые BigDecimal, Strings и другие свойства). Это единственный @OneToOne. Почему @OneToOne ведет себя по-другому здесь?