`

Hibernate 关联关系中的OneToMany 和ManyToOne

阅读更多

集合类型中的OneToMany

@Entity public class City {
    @OneToMany(mappedBy="city")
    public List<Street> getStreets() {
        return streets;
    }
...
}

注:这里OneToMany采用mappedBy方式,表面由子表维护关联关系,也就是说,在加载子表的某条记录时,主表的这个实体Bean也会相应的加载。但反过来,如果加载主表,此时主表中的集合不会加载。

注:默认的加载方式为fetch=FetchType.LAZY

如果关联关系中设置加载方式为立即加载,即:

@Entity public class City {
    @OneToMany(mappedBy="city",fetch=FetchType.EAGER)
    public List<Street> getStreets() {
        return streets;
    }
...
}

此时注意结果集会有重复记录(根据子表中相应记录个数决定多少重复)
如:

主表有如下记录:


子表:

此时如果查询主表,list中有8个实体Bean:

实例如下:

主表:

@Entity
@Table(name = "test_hdr")
public class TmTestTableHdrImpl implements TmTestTableHdr {

.............

   @OneToMany(mappedBy="_header")
    private Set<TmTestTableDtlImpl> _details;

}

子表:

@Entity
@Table(name="test_dtl")
public class TmTestTableDtlImpl implements TmTestTableDtl {

.............

    @ManyToOne
    @JoinColumn(name="test_hdr_id",insertable=false,updatable=false)
    private TmTestTableHdrImpl _header;

}

测试:

1.读子表:

        TestDtlPK dtlPK = new TestDtlPK(testDtlId);
        TmTestTableDtl rec = genDao.read(dtlPK);

结果:

      

2.读主表:

        TestHdrPK hdrPK = new TestHdrPK(testHdrId);
        TmTestTableHdr bean = genDao.read(hdrPK);

结果:

      

如果需要让一对多这一端(即主表)维护关联关系,则需要删除mappedBy元素且加上@JoinColumn并将多对一这端的 @JoinColumn的insertable和updatable设置为false,即:

主表:

@Entity
@Table(name = "test_hdr")
public class TmTestTableHdrImpl implements TmTestTableHdr {

...............

@OneToMany

@JoinColumn(name='test_hdr_id')

private Set<TmTestTableDtlImpl> _details;

}

子表:

@Entity
@Table(name="test_dtl")
public class TmTestTableDtlImpl implements TmTestTableDtl {

.............

    @ManyToOne
    @JoinColumn(name="test_hdr_id",insertable=false,updatable=false)
    private TmTestTableHdrImpl _header;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics