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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章