OneToOne Lazy Loading Invalid Reason Research

来源:互联网 发布:网络教育怎么报名时间 编辑:程序博客网 时间:2024/04/27 17:26

双向一对一关系,只有通过mappedBy指定关系控制方,才会出现懒加载失效的问题。

@Entitypublic class FBO {    @OneToOne(fetch = FetchType.LAZY, mappedBy = "fbo")    OBF obf;    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    @Access(value = AccessType.PROPERTY)    private Long id;    public OBF getObf() {        return obf;    }    public void setObf(OBF obf) {        this.obf = obf;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }}
@Entitypublic class OBF {    @OneToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "fbo_id")    FBO fbo;    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    @Access(value = AccessType.PROPERTY)    private Long id;    public FBO getFbo() {        return fbo;    }    public void setFbo(FBO fbo) {        this.fbo = fbo;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }}

OBF是关系持有方。存储fbo_id. FBO表中无obf_id.
FBO fbo = fboRepository.findOne(1L);
发出两条语句 一条查询fbo 另一条查询obf
Hibernate: select fbo0_.id as id1_2_0_ from fbo fbo0_ where fbo0_.id=?
Hibernate: select obf0_.id as id1_3_0_, obf0_.fbo_id as fbo_id2_3_0_ from obf obf0_ where obf0_.fbo_id=?

OBF obf = obfRepository.findOne(1L); 
仅发出一条SQL,用来查询OBF
Hibernate: select obf0_.id as id1_3_0_, obf0_.fbo_id as fbo_id2_3_0_ from obf obf0_ where obf0_.id=?

因为对于FBO而言没有obf_id,不通过查询,hibernate就无法判断是否在库中存在该对应记录。
这里不可以将FBO内的OBF设置一个HibernateProxy,因为如果FBO确实没有关联OBF,hibernate理论上应该return null
所以针对这种一对一的关系被持有方,hibernate在查询时,会提前将对应数据查询,而使得懒加载无效

原创粉丝点击