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

Подробнее здесь

Другие вопросы по тегам