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;
}