双向实体(OneToMany,ManyToMany)是否需要双方相互添加才能在Hibernate中正确保存?根据我的经验,他们是必需的.只是想确认我的理解.
也就是说,对于下面的权利,是否需要指示的行?
Student student = new Student("Carl");
Course course = new Course("Science");
ReportCard reportCard = new ReportCard("A");
student.getCourses().add(course);
student.getReportCards().add(reportCard);
reportCard.setStudent(student); // <-- Is this required?
course.getStudents().add(student); // <-- Is this required?
studentRepository.save(student);
Run Code Online (Sandbox Code Playgroud)
Student.java
@Entity
public class Student {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "student")
private List<ReportCard> reportCards = new ArrayList<ReportCard>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
private List<Course> courses = new ArrayList<Course>();
@Column
private String name;
}
Run Code Online (Sandbox Code Playgroud)
ReportCard.java
@Entity
public class ReportCard {
@ManyToOne(optional = false)
@JoinColumn(nullable = false)
private Student student;
@Column
private String grade;
}
Run Code Online (Sandbox Code Playgroud)
Course.java
@Entity
public class Course {
@ManyToMany(mappedBy = "courses")
public List<Student> students = new ArrayList<>();
@Column
private String name;
}
Run Code Online (Sandbox Code Playgroud)
编辑:替换@JoinColumn为@Column
Hibernate(ad其他JPA实现)关心关联的拥有方.拥有方是没有mappedBy属性的一方.因此,在您的示例中,reportCard.setStudent(student);是必需的,但student.getReportCards().add(reportCard);不是.
但总的来说,确实最好正确设置关联的每一面,以获得对象的连贯图并简单地避免代码中的错误.
请注意,使用JoinColumn注释String字段是错误的.它们不是连接列,而是列.所以你应该用@Column它来注释它们,尽管如果你没有指定注释的任何属性它也没用.