一尘不染

使用JPA @OneToMany关联时,@ JoinColumn和mappedBy有什么区别

hibernate

之间有什么区别?

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}

阅读 358

收藏
2020-06-20

共1个答案

一尘不染

@JoinColumn
可以在关系的两边使用。
现在的问题是关于使用@JoinColumn@OneToMany侧(极少数情况下)。这里的重点是 物理信息重复
(列名)以及 未优化的SQL查询,这会产生一些其他UPDATE语句

根据文件

由于 多对一的 (几乎)总是 所有者侧 的在JPA规范的双向关系中,一对多关联是通过注解@OneToMany(mappedBy=...)

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
}

Troop``Soldier通过troop属性具有双向的一对多关系。您不必(不必)在mappedBy侧面定义任何物理映射。

以一对多方为拥有方 映射双向一对多,您必须删除mappedBy元素并将多对数设置@JoinColumn为as
insertableupdatablefalse。此解决方案未经过优化,将产生一些其他UPDATE语句。

@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}
2020-06-20