JPA 的 OneToOne 无法延迟加载

support 2019-04-26 2041浏览

在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() {
        ...
    }
}
评论

我来回答

请先登录再回答问题
点击查看大图插件