我正在努力理解JPA OneToMany/ManyToOne。截至目前,正试图理解mappedBy和JoinColumn。
我的实体:
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.persistence.*;
@Entity
@Table(name = "mobile_number")
@Data
@ToString(exclude = "student")
public class MobileNumber {
@Id
private String number;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "student_id")
private Student student;
}
package com.example.demo.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.*;
import java.util.Set;
@Entity
@Table(name = "student")
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "student")
private Set<MobileNumber> mobileNumberSet;
}
我目前的理解:
在这里,MobileNumber是关系的拥有方。由此,我了解到我可以使用MobileNumber实体来持久化/获取学生实体。
因此,如果我简单地写下以下代码:|
MobileNumber mn = new MobileNumber();
mn.setNumber("some_number");
Student s = new Student();
s.setName("TestUser");
mn.setStudent(s);
mobileNumberRepository.save(mn);
- 它将自动持久化Student并进行映射
- 我可以使用Student实体获取MobileNumber实体
- 如果我现在获取Student实体,我将使用相应的MobileNumbers对象填充集合
如果以上几点是正确的,请帮助我
混淆领域:
我也试过另一种方法尝试坚持学生:
Student s = new Student();
s.setName("TestUser");
MobileNumber mn = new MobileNumber();
mn.setNumber("some_number");
Set<MobileNumber> set = new HashSet<>();
set.add(mn);
s.setMobileNumberSet(set);
studentRepository.save(s);
现在我不明白了,这种行为出乎意料。我根本看不到MobileNumber被持久化。
有人能帮助我从这个角度获取和持久化子实体(MobileNumber(是如何工作的吗。
感谢
当您处理双向一对多关联时,您必须始终保持两侧的关联同步。来自Hibernate ORM文档:
无论何时形成双向关联,应用程序开发人员都必须确保双方始终同步。
您的代码应该如下所示:
Student s = new Student();
s.setName("TestUser");
MobileNumber mn = new MobileNumber();
mn.setNumber("some_number");
mn.setStudent(s);
Set<MobileNumber> set = new HashSet<>();
set.add(mn);
s.setMobileNumberSet(set);
studentRepository.save(s);
请注意,您也可以将属性hibernate.enhancer.enableAssociationManagement
设置为true。这将启用Hibernate ORM字节码增强功能,您以前的代码也会起作用。