【问题标题】:How can I create an intermediate table between to entities using @ManyToMany with hibernate?如何使用带有休眠的@ManyToMany 在实体之间创建中间表?
【发布时间】:2018-04-10 22:16:43
【问题描述】:

几天前我做了这个,我有一个这样的中间表:

-------------------------
|COURSE_ID | STUDENT_ID |
------------------------
|0         |1           |
|0         |2           |
|1         |1           |
|1         |2           |
-------------------------

但后来我想向它添加字段(并没有将它提交到 github ¬¬,我很着急)并最终打破了整个事情...... 长话短说,我又开始了这个例子。 我的代码现在创建了两个表“课程”和“学生”,但它们没有反映它们之间的任何关系,我的意思是没有创建中间表;尽管我可以在对象世界中向每个学生询问课程,反之亦然,但在数据库世界中,这一切都没有反映出来。 这是我的代码:


学生班 封装模型;

import java.util.HashSet;
import javax.persistence.JoinColumn;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import java.util.Set;

@Entity
@Table(name="STUDENTS")
public class Student
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id ;

    private String name ;

    @ManyToMany(targetEntity=Course.class, mappedBy="courseName", fetch=FetchType.EAGER)
    private Set<Course> courses ;

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

    public void addCourse(Course myCourse)
    {
        this.courses.add(myCourse) ;
    }


    @Column(name="STUDENT_ID")
    public int getStudent_id()
    {
        return this.id ;
    }


    @JoinTable(name="COURSE_STUDENTS",
        joinColumns=
            @JoinColumn(name="STUDENT_ID"),
        inverseJoinColumns=
            @JoinColumn(name="COURSE_ID")
                )
    public Set<Course> getCourses()
    {
        return this.courses ;
    }

    @Column(name="STUDENT_NAME")
    public String getStudent_name()
    {
        return this.name ;
    }

}

课程班

package model;

import java.util.HashSet;
import java.util.Set;

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

@Entity
@Table(name="COURSES")
public class Course
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id ;

    @Column(name="COURSE_NAME")
    private String courseName ;

    @ManyToMany(targetEntity=Student.class, mappedBy="name", fetch=FetchType.EAGER)
    private Set<Student> students ;


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

    public void addStudent(Student myStudent)
    {
        this.students.add(myStudent) ;
    }

    @ManyToMany(mappedBy="courses")
    public Set<Student> getCourse_students()
    {
        return this.students ;
    }

    @Column(name="COURSE_ID")
    public int getCourse_id()
    {
        return id ;
    }
}

测试这个的主类

package controller;

import javax.persistence.EntityManager;

import db.EntityManagerHelper;
import model.Student;
import model.Course;

public class Main {

    public static void main(String[] args) {

        EntityManager entityManager= EntityManagerHelper.getEntityManager();

        Course course_kK = new Course("K1000") ;
        Course course_mK = new Course("M1000") ;
        Course course_rK = new Course("R1000") ;

        Student student_rick = new Student("Rick") ;
        student_rick.addCourse(course_rK);
        student_rick.addCourse(course_mK);

        Student student_rock = new Student("Rock") ;
        student_rock.addCourse(course_rK);
        student_rock.addCourse(course_kK);

        Student student_jack = new Student("Jack") ;
        student_jack.addCourse(course_mK);
        student_jack.addCourse(course_kK);

        course_kK.addStudent(student_rock);
        course_kK.addStudent(student_jack);
        course_mK.addStudent(student_jack);
        course_mK.addStudent(student_rick);
        course_rK.addStudent(student_rock);
        course_rK.addStudent(student_rick);

        System.out.println("course_rK:id = "+course_rK.getCourse_id());
        System.out.println("course_kK:id = "+course_kK.getCourse_id());
        System.out.println("course_mK:id = "+course_mK.getCourse_id());

        EntityManagerHelper.beginTransaction();

        entityManager.persist(course_rK);
        entityManager.persist(course_kK);
        entityManager.persist(course_mK);

        entityManager.persist(student_rick);
        entityManager.persist(student_rock);
        entityManager.persist(student_jack);

        entityManager.flush();
        EntityManagerHelper.commit();   

        System.out.println("student_jack:id = "+student_jack.getStudent_id());
        System.out.println("student_rock:id = "+student_rock.getStudent_id());
        System.out.println("student_gast:id = "+student_rick.getStudent_id());
    }
}

如何在这两个实体之间创建中间表来“破坏”多对多关系?

【问题讨论】:

    标签: java mysql hibernate annotations many-to-many


    【解决方案1】:

    这是详细的答案。我不得不在几行中进行更改...我检查了this 教程(再次),当我能够做我在原始问题中提出的问题时,我第一次遵循的相同。

    它说的地方

    @Column(name="COURSE_ID")
    

    我改成

    @Column(name="COURSE_ID", unique=true, nullable=false)
    

    它说的地方

    @Column(name="STUDENT_ID")
    

    我改成

    @Column(name="STUDENT_ID", unique=true, nullable=false)
    

    它说的地方

    @ManyToMany(targetEntity=Course.class, mappedBy="courseName", fetch=FetchType.EAGER)
    

    我改成

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    

    它说的地方

    @ManyToMany(mappedBy="courses")
    

    我改成

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "courses")
    

    它说的地方

     @JoinTable(name="COURSE_STUDENTS",
            joinColumns=
                @JoinColumn(name="STUDENT_ID"),
            inverseJoinColumns=
                @JoinColumn(name="COURSE_ID")
                    )
        public Set<Course> getCourses()
        {
            return this.courses ;
        }
    

    我改成

    @JoinTable(name = "STUDENT_COURSE", joinColumns = {
            @JoinColumn(name = "STUDENT_ID", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "COURSE_ID",
                    nullable = false, updatable = false) }
                )
    public Set<Course> getCourses()
    {
        return this.courses ;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多