【问题标题】:Spring Boot JPA many to many removing join table relationshipSpring Boot JPA 多对多删除连接表关系
【发布时间】:2021-07-12 13:21:14
【问题描述】:

我有一个实体 Student 和一个实体 Course,它们有多对多的关系,Student 类是所有者。我可以为学生添加课程,但无法为学生删除课程。我确实创建了一个用于删除连接的实用程序方法,但它不起作用,而且我无法找到错误的原因。没有错误,它什么也不做。 也许有人遇到过类似的事情?提前谢谢你

数据库架构是简单的多对多关系

这里是学生实体:

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="student")
public class Student implements Serializable{
    
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    
    @Column(name="first_name")
    private String firstName;
    
    @Column(name="last_name")
    private String lastName;
    
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})//(fetch = FetchType.LAZY)
    @JoinTable(name = "student_course",
            joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set<Course> courseTaken = new HashSet<>();
    
    public Student() {
    }

    public Student(String firstName, String lastName, Set<Course> courseTaken) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.courseTaken = courseTaken;
    }

    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> getCourseTaken() {
        return courseTaken;
    }

    public void setCourseTaken(Set<Course> courseTaken) {
        this.courseTaken = courseTaken;
    }
    
    public void removeCourse(Course tempCourse) {
        courseTaken.remove(tempCourse);
        tempCourse.getStudentAttending().remove(this);
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", courseTaken="
                + courseTaken + "]";
    }       
}

这是一个课程实体:

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="course")
public class Course implements Serializable{
    
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    
    @Column(name="course_name")
    private String courseName;
    
    @Column(name="course_description")
    private String courseDescription;
    
    @ManyToMany(mappedBy = "courseTaken")
    private Set<Student> studentAttending  = new HashSet<>();
    
    public Course() {
    }

    public Course(String courseName, String courseDescription, Set<Student> studentAttending) {
        this.courseName = courseName;
        this.courseDescription = courseDescription;
        this.studentAttending = studentAttending;
    }

    public long getId() {
        return id;
    }

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

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseDescription() {
        return courseDescription;
    }

    public void setCourseDescription(String courseDescription) {
        this.courseDescription = courseDescription;
    }

    public Set<Student> getStudentAttending() {
        return studentAttending;
    }
    
    public void setStudentAttending(Set<Student> studentAttending) {
        this.studentAttending = studentAttending;
    }
    
    @Override
    public String toString() {
        return "Course [id=" + id + ", courseName=" + courseName + ", courseDescription=" + courseDescription + "]";
    }   
}

【问题讨论】:

  • 你能把代码从学生身上删除吗?

标签: java spring spring-boot spring-mvc spring-data-jpa


【解决方案1】:

哦,我找到了我错过的东西,我只是忘记将更改保存到数据库中,student.save 丢失了。所有作品。

@GetMapping("/deleteCourse")
    public String deleteCourseForStudent(@RequestParam("courseId") Long courseId, @RequestParam("studentId") Long studentId) {
        
        Course tempCourse = courseService.findById(courseId);
        Student tempStudent = studentService.findById(studentId);
        
        tempStudent.removeCourse(tempCourse);
        
        studentService.save(tempStudent);
        
        return "redirect:/student/details?studentId=" + studentId;
    }

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2021-02-05
    • 1970-01-01
    • 2020-09-12
    • 2022-08-18
    • 2018-07-04
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多