【问题标题】:Java - Hibernate @ManyToMany mapping adds records in the database only in one directionJava - Hibernate @ManyToMany 映射仅在一个方向上添加数据库中的记录
【发布时间】:2013-10-29 04:32:59
【问题描述】:

我是 Hibernate 的新手,但遇到了问题。我有两个实体(学生和课程)。学生可以有很多课程,课程可以有很多学生。当我制作一门新课程并将其添加到数据库中时,在同一个会话中,我将此课程添加到学生的课程中(student.getCourses().add(course)),一切正常,并且在课程中都添加了记录表和 Students_Courses 表。当我在另一个方向上做同样的事情时,它不能正常工作。首先,我在数据库中添加一个新学生。我参加了现有的课程并执行 (course.getStudents().add(student)) 但在 Students_Courses 表中没有保存任何记录。多对多映射都是 PERSIST 级联的,所以它必须工作。

你知道问题可能是什么吗? 我正在使用 MSSQL 数据库。

第一个方向(不工作 - 只有新学生保存在数据库中)

Session session = HibernateUtils.getSessionFactory().openSession();
    session.beginTransaction();
    {
        Faculty faculty = (Faculty) session.get(Faculty.class, 1);

        Student newStudent = new Student();
        newStudent.setFaculty(faculty);
        newStudent.setGrade(3.0);
        newStudent.setName("Some student name");

        session.save(newStudent);

        Course course = (Course) session.get(Course.class, 1);
        course.getStudents().add(newStudent);
        // session.update(course); This does not have any effect because the course is persistent anyway

        session.getTransaction().commit();
        session.close();
    }

第二个方向(工作正常 - 新课程和中间表中的记录都保存在数据库中)

Session session = HibernateUtils.getSessionFactory().openSession();
    session.beginTransaction();
    {
        Course newCourse = new Course();
        newCourse.setName("Some course name");

        session.save(newCourse);

        Student student = (Student) session.get(Student.class, 1);
        student.getCourses().add(newCourse);

        session.getTransaction().commit();
        session.close();
    }

这里是学生实体

@Entity(name = "Students")
public class Student {
    @Id
    @GeneratedValue
    @Column(name = "StudentId")
    private int id;

    @Column(name = "Name", nullable = false, length = 50)
    private String name;

    @Column(name = "Grade")
    private Double grade = null;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FacultyId", nullable = false)
    private Faculty faculty;

    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
        joinColumns = @JoinColumn(name = "StudentId"),
        inverseJoinColumns = @JoinColumn(name = "CourseId"))
    private Collection<Course> courses;

    public Student() {
        this.courses = new HashSet<Course>();
    }

    // Setters and Getters for all fields
}

还有课程实体

@Entity(name = "Courses")
public class Course {
    @Id
    @GeneratedValue
    @Column(name = "CourseId")
    private int id;

    @Column(name = "Name", nullable = false, length = 100)
    private String name;

    @ManyToMany(mappedBy = "courses", cascade = CascadeType.PERSIST)
    private Collection<Student> students;

    public Course() {
        this.students = new HashSet<Student>();
    }

    // Setters and Getters for all fields
}

【问题讨论】:

    标签: java database hibernate mapping many-to-many


    【解决方案1】:

    请参阅以下内容:

    Cascade.ALL from non-owning entity side

    我还建议封装添加/删除操作。这些集合的 getter 是否返回不可修改的集合并强制客户端使用以下内容以正确设置关系:

    public class Course{
    public void addStudent(Student student){
    this.students.add(student);
    student.getCourses().add(this);
    }
    }
    
    public class Student{
    public void addCourse(Course course){
    this.courses.add(course);
    course.students.add(this);
    }
    }
    

    【讨论】:

    • 谢谢伙计。有效。当我获得足够的声望时,我会投票给你,因为现在我有 8 个:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多