双向一对一关系,只有通过mappedBy指定关系控制方,才会出现懒加载失效的问题。
@Entity
public 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;
}
}
@Entity
public 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在查询时,会提前将对应数据查询,而使得懒加载无效