Hibernate сохранить временный экземпляр - PullRequest
0 голосов
/ 15 октября 2018

Итак, у меня есть две сущности с двунаправленным отношением @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, но не смог решить проблему.Нужна помощь!Заранее спасибо!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...