Hibernate 关联关系中的OneToMany 和ManyToOne

本文深入解析了Java持久化框架中OneToMany关联映射的方式及其影响。详细介绍了mappedBy属性的作用及使用场景,探讨了不同加载策略对应用程序性能的影响,并通过示例展示了如何正确配置实体间的一对多关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值