JPA JoinColumn 与 mappedBy

新手上路,请多包涵

有什么区别:

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

原文由 Mike 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 554
2 个回答

@JoinColumn 可以用在关系的两边。 问题是关于在 @OneToMany 端使用 @JoinColumn --- (罕见情况)。这里的重点是 _物理信息重复_(列名)以及 _未优化的 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 元素并将多对一设置为 @JoinColumn 作为 insertableupdatable 为假。此解决方案未优化,会产生一些额外 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() {
    ...
}

原文由 Mike 发布,翻译遵循 CC BY-SA 4.0 许可协议

注释 @JoinColumn 表示这个实体是关系的 _所有者_(即:对应的表有一个带有引用表外键的列),而属性 mappedBy 表示这边的实体是关系的逆向,所有者驻留在“其他”实体中。这也意味着您可以从用“mappedBy”(完全双向关系)注释的类中访问另一个表。

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

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

原文由 Óscar López 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题