@JoinColumn 和 mappedBy 用于拥有方和反方
Posted
技术标签:
【中文标题】@JoinColumn 和 mappedBy 用于拥有方和反方【英文标题】:@JoinColumn and mappedBy for owning side and reverse side 【发布时间】:2019-11-14 17:58:25 【问题描述】:我对休眠中的@JoinColumn
和mappedBy
有疑问,在我阅读了*** 和其他博客中的这么多帖子之后,我仍然感到困惑。
以这个为例,每个员工都有很多电子邮件,一个员工可以拥有很多电子邮件:
第一个声明: 电子邮件是拥有方,因为它具有 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
mappedBy
是否将删除操作应用于已从关系中删除的实体,并将删除操作级联到这些实体
【讨论】:
以上是关于@JoinColumn 和 mappedBy 用于拥有方和反方的主要内容,如果未能解决你的问题,请参考以下文章
使用 joinColumn 而不是 mappedBy 有啥危害?
仅使用 @mappedBy ,不使用@JoinColumn - 在 OneToMany 关系中创建的连接列,那么 JoinColumn 的用途是啥?
Associations marked as mappedBy must not define database mappings like @JoinTable or @JoinColumn报错