Не удается вставить запись для отношения ManyToMany в Spring Boot - PullRequest
0 голосов
/ 27 мая 2020

Я знаю, что есть множество сообщений об этой проблеме, и я пробовал их решения, но все еще не смог решить свою проблему. Я запустил приложение Spring Boot, и оно подключено к postge sql db. У меня есть два класса: Студент и Курс. Я хочу создать между ними отношение ManyToMany. Когда я запускаю приложение, оно создает таблицы, как я хотел. А также, если я вставлю запись для таблицы course_student, я смогу отобразить курсы, которые принимает студент. Но я могу добавить новый курс для студента, ничего не происходит.

Студенческий класс

package com.example.demo.models;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "students")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String firstName;

    @Column(nullable = false)
    private String lastName;

    @ManyToMany(
        fetch = FetchType.LAZY,
        cascade = {
                CascadeType.ALL,
        },
        mappedBy = "students"
    )
    private Set<Course> courses = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Set<Course> getCourses() {
        return courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }
}

Курс

package com.example.demo.models;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "courses")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @ManyToMany(
        fetch = FetchType.LAZY,
        cascade = {
            CascadeType.ALL,
        }
    )
    @JoinTable(
        name = "course_student",
        joinColumns = { @JoinColumn(name = "course_id") },
        inverseJoinColumns = { @JoinColumn(name = "student_id") }
    )
    private Set<Student> students = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }
}

IStudentRepository

package com.example.demo.repositories;

import com.example.demo.models.Student;
import org.springframework.data.jpa.repository.JpaRepository;

public interface IStudentRepository extends JpaRepository<Student, Long> {
}

Класс SqlStudentService

package com.example.demo.services;

import com.example.demo.models.Course;
import com.example.demo.models.Student;
import com.example.demo.repositories.IStudentRepository;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("SqlStudentService")
public class SqlStudentService implements IStudentService {
    private final IStudentRepository studentRepository;

    public SqlStudentService(IStudentRepository studentRepository) {
        this.studentRepository = studentRepository;
    }

    public List<Student> getStudents() {
        return studentRepository.findAll(Sort.by(Sort.Direction.ASC, "id"));
    }

    public Student getStudentById(Long id) {
        return studentRepository.findById(id).orElse(null);
    }

    public Student insertStudent(Student student) {
        return studentRepository.save(student);
    }

    public Student updateStudent(Long id, Student student) {
        Student oldStudent = getStudentById(id);

        if (oldStudent != null) {
            oldStudent.setFirstName(student.getFirstName());
            oldStudent.setLastName(student.getLastName());

            return studentRepository.save(oldStudent);
        }
        return null;
    }

    public void deleteStudentById(Long id) {
        studentRepository.deleteById(id);
    }

    public void addStudentToCourse(Course course, Long studentId) {
        Student student = getStudentById(studentId);

        if (student != null) {
            student.getCourses().add(course);
            studentRepository.save(student);
        }
    }
}

Все остальные функции в классе SqlStudentService работают правильно, но метод addStudentToCourse не работает . Я вернул объект Student после student.getCourses (). Add (course); линия. Курс успешно добавлен. Но он не добавляется к этой записи в таблицу course_student. Вы хоть представляете, что мне не хватает? Большое вам спасибо.

1 Ответ

0 голосов
/ 27 мая 2020
 @ManyToMany
 @JoinTable(name = "course_student", joinColumns = { @JoinColumn(name = "course_id_fk", referencedColumnName   ="course_id_pk") },
inverseJoinColumns = { @JoinColumn(name = 
   "student_id_fk",referencedColumnName="student_id_pk") })

private Set<Student> students;

Вам не нужно использовать Cascading Type = All и тип выборки, так как по умолчанию это ленивый

...