У меня проблема во многих отношениях со многими в репозитории jpa для сохранения со ссылкой в ​​таблице соединений - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть студенческий класс

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "first_name")
    private String firstName;

    @ManyToMany(mappedBy = "students", fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH})
    private List<Course> courses;

    public void addCourse(Course theCourse) {
        if (courses == null) {
            courses = new ArrayList<>();
        }
        courses.add(theCourse);
        theCourse.addStudents(this);
    }

}
@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.PERSIST, CascadeType.REFRESH})
    private List<Student> students;

    public void addStudents(Student theStudent) {
        if (students == null) {
            students = new ArrayList<>();
        }
        students.add(theStudent);
    }
}
//definitely I wrote syntax wrong here because i don't copy and paste from code.
Course c =new Course(//fill constrouctor);
CourseRepositoryy.save(c);

student s = new Student(//fill constrouctor);
s.addCourse(c)
StudentRepository.save(s);

or

student s = new Student(//fill constrouctor);
Course c =new Course(//fill constrouctor);
c.addStudents(s);
save(s);
save(c);

Теперь я хочу создать студента и курс и сохранить их, сохраняя каждую ссылку в таблице соединений. Я не знаю, какой из них сначала, а затем добавить другой к этому. кто-нибудь может помочь мне и иметь ссылку, которая описывает эту топи c?

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы хотите двунаправленные отношения «многие ко многим», вы должны определить сторону владельца. Поэтому, если вы выберете Курс в качестве стороны-владельца, отображение будет выглядеть следующим образом:

public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @ManyToMany(cascade = CascadeType.PERSIST)
    private List<Student> students = new ArraysList<>();
...
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "first_name")
    private String firstName;

    @ManyToMany(mappedBy = "students")
    private List<Course> courses = new ArrayList<>();

Из javado c из @ManyToMany ссылка

Если ассоциация является двунаправленной, любая сторона может быть назначена в качестве стороны-владельца. Если отношение является двунаправленным, сторона, не являющаяся владельцем, должна использовать элемент mappedBy аннотации ManyToMany, чтобы указать поле отношения или свойство стороны-владельца.

Если у вас есть сопоставление как указано выше: операция сохранения Stundent будет каскадно добавлена ​​к Course.

Course course = new Course();
List<Student> studentList = new ArrayList<>();

course.getStudents().addAll(studentList);

em.persist(course);

Для получения более подробной информации: официальные документы

...