首页 > 解决方案 > @JoinColumn 和 mappedBy 用于拥有方和反方

问题描述

@JoinColumn我对hibernate的and有疑问mappedBy,在我阅读了stackoverflow和其他博客中的这么多帖子之后,我仍然感到困惑。

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

在此处输入图像描述

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

在休眠中,对于双向关系:

员工

@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

我很困惑,哪个是合适的?

标签: databasehibernatespring-bootjpaorm

解决方案


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

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


推荐阅读