Spring Rest数据投影@OneToOne属性未加载

时间:2018-04-30 21:47:38

标签: hibernate spring-rest spring-projections

我有这三个类:

@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();
} 

现在,当我使用投影对我的trip API执行GET时,返回的JSOn中TripDetail中的customComponents对象为null。

如果我将TripDetail中的customComponents属性更改为急切加载(fetch = FetchType.EAGER),那么生成的JSON是正确的(因为它包含customComponents&#39;数据内联)。

我想明白为什么会这样?

TripDetail还有许多其他属性,为简洁起见(一些@OneToMany,一些BigDecimal,Strings和其他属性)。这是唯一的@OneToOne。为什么@OneToOne在这方面表现不同?

1 个答案:

答案 0 :(得分:1)

查看这段代码

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

你告诉Hibernate以LAZY方式加载CustomComponents。即它只在需要时加载其细节。

因此,如果您正在调试并查找customComponents,它将为null。

但是当你尝试从CustomComponents中读取一些数据时,它应该加载customComponents的详细信息。

由于Hibernate会在引擎盖下发出另一个查询

select * from CustomComponents where id = ?

这就是LAZY如何运作

更多详情here