我在休眠状态下对@JoinColumn
和mappedBy
存有疑问,在我阅读了stackoverflow和其他博客中的大量帖子后,我仍然感到困惑。
以这个为例,每个员工有很多电子邮件,并且一个员工可以拥有许多电子邮件:
第一条语句: 电子邮件是“拥有方” ,因为它具有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
在拥有的一侧。
我很困惑,哪个合适?
答案 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
mappedBy
是否将删除操作应用于从关系中删除的实体,并将删除操作级联到那些实体
答案 1 :(得分:2)
@JoinColumn批注在拥有外键的类中维护。根据您的代码,Email类将使用@JoinColumn批注指定外键引用。它实际上有助于两个表之间的映射,因为您通过此注释指定了桥接列名称“ employee_id”。
另一方面,mappedBy仅用于启用实体之间的双向映射。因此,应在背面(非拥有类)使用它。