Spring Rest Проекция данных @OneToOne свойство не загружается - PullRequest
0 голосов
/ 01 мая 2018

У меня есть три класса:

@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 ведет себя по-другому здесь?

1 Ответ

0 голосов
/ 01 мая 2018

Глядя на этот кусок кода

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private CustomComponents customComponents;

Вы говорите Hibernate загружать пользовательские компоненты LAZY. Т.е. он будет загружать свои детали только при необходимости.

Так что, если вы отлаживаете и ищете нестандартные компоненты, оно будет нулевым.

Но далее, когда вы пытаетесь прочитать некоторые данные из CustomComponents, он должен загрузить детали customComponents.

Поскольку Hibernate запустит еще один запрос под капотом, говорящий

select * from CustomComponents where id = ?

Вот как работает LAZY

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

...