在JPA中,一对一父子关系表通常会使用双向OneToOne关系。例如:
@Entity
public class Info {
@Id
private Long id;
@OneToOne(mappedBy = "info", fetch = FetchType.LAZY)
private InfoDetail detail;
}
@Entity
public class InfoDetail {
@Id
private Long id;
@MapsId
@OneToOne
private Info info;
}
此时查询Info
对象,会同时查询出InfoDetail
对象。没有延迟加载的效果。
因为Info
可以独立存在,所以不能确定一个Info对象是否有关联的InfoDetail
对象。这时JPA不清楚属性detail
是应该为null
还是应该为代理对象,只有发送一条sql语句查询InfoDetail
表,以确定是否存在对于数据,延迟加载自然就失效了。
直接查询InfoDetail
对象则不存在这个问题,因为InfoDetail
是主控方,一定有对应的Info
存在。
结论是双向的OneToOne中父对象的延迟加载会一定会失效,无法解决。
如果父对象一定要实现延迟加载,那么父对象与子对象的关系可以改为OneToMany
。如:
@Entity
public class Info {
@Id
private Long id;
@OneToMany(mappedBy = "info")
private Set<InfoDetail> details;
// 从details中获取detail对象
public getDetail() {
...
}
}