我有这三个类:
@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在这方面表现不同?
答案 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