集合類型中的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;
}