JPA JoinColumn vs mappby

2022-08-31 04:13:28

有什么区别:

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

答案 1

批注指示此实体是关系的所有者(即:相应的表具有指向所引用的表的外键的列),而属性指示此端中的实体是关系的反面,并且所有者驻留在“其他”实体中。这也意味着您可以从使用“mappedBy”(完全双向关系)注释的类访问其他表。@JoinColumnmappedBy

特别是,对于问题中的代码,正确的注释将如下所示:

@Entity
public class Company {
    @OneToMany(mappedBy = "company",
               orphanRemoval = true,
               fetch = FetchType.LAZY,
               cascade = CascadeType.ALL)
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

答案 2

@JoinColumn可以在关系的双方使用。问题是关于在侧面使用(罕见情况)。这里的要点是物理信息重复(列名)以及未优化的SQL查询,这将产生一些额外的UPDATE语句@JoinColumn@OneToMany

根据文档

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

要将双向一个映射到多个,以一对多的一侧作为所属侧,您必须删除该元素并将多个元素设置为一 as 和 false。此解决方案未优化,将生成一些其他语句。mappedBy@JoinColumninsertableupdatableUPDATE

@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() {
    ...
}

推荐