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

标签 database hibernate spring-boot jpa orm

我对 hibernate 中的 @JoinColumnmappedBy 有疑问,在我阅读了 stackoverflow 和其他博客中的许多帖子后,我仍然感到困惑。

以此为例,每个员工有多个邮箱,一个员工可以拥有多个邮箱:

enter image description here

第一条声明: Email拥有方,因为它具有 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 位于拥有方。

我很困惑,哪个合适?

最佳答案

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

另一方面,mappedBy只是用来启用实体之间的双向映射。所以,它应该在反向(非拥有类)上使用。

关于database - @JoinColumn 和 mappedBy 用于拥有方和反方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56880372/

相关文章:

java - @Valid 不适用于嵌套对象(Java/Spring Boot)

sql - 查询SQL数据库,如何获取用户位置附近的最近点?

database - 游戏中使用什么样的数据库?

c# - 处理和存储耗时

java - 是否可以使 Hibernate 查询在多记录查询中跳过坏记录?

java - spring-boot 3.0.0 GraaVM 用于接口(interface) jakarta.servlet.http.HttpServletRequest

spring - 按配置文件禁用/删除 Spring Boot 数据源

python - 一些疯狂的代码和疯狂的数据。在 mysql 数据库中插入行(python)

java - 发生 UnsatisfiedDependencyException 错误

java - 摆脱 "No Hibernate Session bound to thread"并在读取方法上使用 @Transactional 进行性能