【发布时间】: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