OneToOne Lazy Loading Invalid Reason Research

双向一对一关系,只有通过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在查询时,会提前将对应数据查询,而使得懒加载无效

你可能感兴趣的:(Java,JPA)