小编典典

JPA JoinColumn 与 mappedBy

all

有什么区别:

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

阅读 126

收藏
2022-03-07

共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通过部队属性具有双向的一对多关系。您不必(不得)在mappedBy侧面定义任何物理映射。

要将双向一对多映射,将 一对多作为拥有方
,您必须删除mappedBy元素并将多设置为一@JoinColumninsertable并将其​​设置updatable
false。这个解决方案没有优化,会产生一些额外的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() {
    ...
}
2022-03-07