@JoinColumn 和 mappedBy 用于拥有方和反方

Posted

技术标签:

【中文标题】@JoinColumn 和 mappedBy 用于拥有方和反方【英文标题】:@JoinColumn and mappedBy for owning side and reverse side 【发布时间】:2019-11-14 17:58:25 【问题描述】:

我对休眠中的@JoinColumnmappedBy 有疑问,在我阅读了*** 和其他博客中的这么多帖子之后,我仍然感到困惑。

以这个为例,每个员工都有很多电子邮件,一个员工可以拥有很多电子邮件:

第一个声明: 电子邮件拥有方,因为它具有 Employee 表的外键,通常在关系中,“ “多”方是拥有方。

在hibernate中,对于双向关系:

员工

@Entity
@Table(name = "employee")
public class Employee

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "employee")
    private List<Email> emails = new ArrayList<>();

    //Constructors, getters and setters removed for brevity

电子邮件

@Entity
@Table(name = "email")
public class Email

    @Id
    @GeneratedValue
    private Long id;

    private String email;

    @ManyToOne
    @JoinColumn(name = "employee_id")
    private Employee employee;

    //Constructors, getters and setters removed for brevity

所以根据我的阅读,通常@JoinColumn 在拥有方,mappedBy 在反面。

但我也从某处得知@JoinColumn 在反面,而mappedBy 在拥有方。

我一头雾水,哪个合适?

【问题讨论】:

【参考方案1】:

@JoinColumn 注释在拥有外键的类中维护。根据您的代码,电子邮件类将使用 @JoinColumn 注释指定外键引用。它实际上有助于两个表之间的映射,因为您通过此注解指定了桥接列名称“employee_id”。

另一方面,mappedBy 仅用于启用实体之间的双向映射。因此,它应该用于反面(非拥有类)。

【讨论】:

【参考方案2】:

用户 -> 资产(一对多)

Employee.java

 @JsonBackReference
 @OneToMany(mappedBy="user",fetch=FetchType.LAZY)
 private List<Asset> asset = new ArrayList<>();

资产.java

    @JsonManagedReference
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="id", nullable = false)
    private User user;

@JoinColumn

如果连接是针对使用外部的 OneToOne 或 ManyToOne 映射 键映射策略,外键列在表中 源实体或嵌入。 如果连接用于使用外部的单向 OneToMany 映射 键映射策略,外键在目标表中 实体。 如果连接用于多对多映射或 OneToOne 或 使用连接表的双向 ManyToOne/OneToMany 映射, 外键在连接表中。 如果连接是针对元素集合,则外键位于 收集表。

mappedBy

是否将删除操作应用于已从关系中删除的实体,并将删除操作级联到这些实体

【讨论】:

以上是关于@JoinColumn 和 mappedBy 用于拥有方和反方的主要内容,如果未能解决你的问题,请参考以下文章

使用 joinColumn 而不是 mappedBy 有啥危害?

仅使用 @mappedBy ,不使用@JoinColumn - 在 OneToMany 关系中创建的连接列,那么 JoinColumn 的用途是啥?

JoinColumn vs mappedBy

Associations marked as mappedBy must not define database mappings like @JoinTable or @JoinColumn报错

Spring Boot:与@JoinColumn 的 ManyToOne 关系保持外键为空

JPA:@JoinColumn 和 @PrimaryKeyJoinColumn 之间的区别?