@JoinColumn和mappedBy用于拥有一面和反面

时间:2019-07-04 03:42:18

标签: database hibernate spring-boot jpa orm

我在休眠状态下对@JoinColumnmappedBy存有疑问,在我阅读了stackoverflow和其他博客中的大量帖子后,我仍然感到困惑。

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

enter image description here

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

在休眠状态下,用于双向关系:

员工

@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在拥有的一侧。

我很困惑,哪个合适?

2 个答案:

答案 0 :(得分:2)

用户->资产(一对多)

Employee.java

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

Asset.java

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

@JoinColumn

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

mappedBy

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

答案 1 :(得分:2)

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

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