Итак, у меня есть две сущности с двунаправленным отношением @ManyToMany - Student и Course.Класс моего ученика:
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue
private int id;
@Column(name = "role", unique = true, nullable = false)
private String studentName;
@ManyToMany
@JoinTable(name = "student_course",
joinColumns = {@JoinColumn(name = "student_id",
referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "course_id",
referencedColumnName =
"id")})
private Set<Course> course = new HashSet<>();
public String getStudentName() {
return studentName;
}
public void setStudentName(final String studentName) {
this.studentName = studentName;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(final Set<Course> courses) {
this.courses = courses;
}
@Override
public int hashCode() {
...
}
@Override
public boolean equals(final Object obj) {
...
}
@Override
public String toString() {
...
}
Класс моего курса:
@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue
private int id;
@Column(name = "course", nullable = false, unique = true)
private String course;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "courses")
private Set<Student> students = new HashSet<>();
public String getCourse() {
return course;
}
public void setCourse(final String course) {
this.course = course;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(final Set<Student> students) {
this.students = students;
}
@Override
public int hashCode() {
...
}
@Override
public boolean equals(final Object obj) {
...
}
@Override
public String toString() {
...
}
С помощью hibernate entitymanager я хочу сохранить обе сущности.Так что в моем DbInitializer () у меня есть что-то вроде этого, которое заполняет данные для сущности курса.
private Set<Course> initCourses() {
final Set<Course> courses =
CourseProvider.getTestCourses();
for (final Course course : courses) {
entityManager.persist(course);
}
return courses;
}
Это прекрасно работает.Но когда я пытаюсь заполнить данные для объекта Student, он запрашивает у меня сохранение временного экземпляра перед сбросом.
private List<Student> initStudents() {
final Set<Student> students = StudentProvider.getTestStudents();
for (final Student student : students) {
entityManager.persist(student);
}
return students;
}
Класс StudentProvider:
public class StudentProvider {
public static List<Student> getTestStudentsList() {
final List<Student> students =
StudentFactory.createStudents();
return students;
}
}
Класс StudentFactory:
public class StudentFactory {
public static final List<Student> createStudents() {
final EnumSet<StudentEnum> students =
EnumSet.allOf(StudentEnum.class);
final List<Student> studentList = new ArrayList<>();
for (final StudentEnum s : students) {
final Student student = new Student();
student.setStudentName(s.toString());
student.setCourses(s.transform());
studentList.add(student);
}
return studentList;
}
StudentProvider вызывает StudentFactory, который устанавливает значения для Student.StudentEnum имеет список студентов с соответствующими курсами.
Мне известно, что cascade = CascadeType.ALL может решить эту проблему.Я попытался использовать его, но он дает мне «Ошибка повторяющегося ввода для объекта курса».И если я не использую каскад, он просит меня сохранить временный экземпляр.
Может кто-нибудь предложить мне способ без использования cascasde ???Я понимаю, что должен сохранить сущность курса, прежде чем сохранить сущность ученика.
Я прошел через пару вопросов Stackoverflow, но не смог решить проблему.Нужна помощь!Заранее спасибо!:)