例子:
-
学生与课程之间多对多关系
-
如果想要知道学生选了哪些课,需要在学生类配置ManyToMany,
-
如果想要知道该课程有哪些学生,需要在课程类配置ManyToMany
-
如果以上两种都需要,则在两边都得配置ManyToMany
-
无论哪一种配置,表结构都一样(都有中间表自动生成),只是表之间关系在对表操作时有限制(比如只在学生类配置了ManyToMany,则无法通过课程查询学生),表结构如下:
单边配置ManyToMany,如下:
Student.java
public class Student {
private int id;
private String name;
private Set<Course> courses;
//get、set省略
}
Student.hbm.xml
Course.java
public class Course {
private int id;
private String name;
//get、set省略
}
Course.hbm.xml
- 添加数据
/*
*两名学生选了两门相同的课程
*/
public void testAdd(){
Course c1 = new Course();
c1.setName("Java");
Course c2 = new Course();
c2.setName("C#");
Set<Course> set = new HashSet<Course>();
set.add(c1);
set.add(c2);
Student s1 = new Student();
s1.setName("Tom");
s1.setCourses(set);
Student s2 = new Student();
s2.setName("Jack");
s2.setCourses(set);
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(c1);
session.save(c2);
session.save(s1);
session.save(s2);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 结果
- 查询学号为1的学生所选的课程
public void testLoad(){
Student s = new Student();
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
s = (Student)session.load(Student.class, 1);
System.out.println("Student Name:"+s.getName());
for(Course c: s.getCourses()){
System.out.println("Course Name:"+c.getName());
}
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
两边都配置ManyToMany(跟单边配置一样,就是两边都要),如下:
Student.java
public class Student {
private int id;
private String name;
private Set<Course> courses;
//get、set省略
}
Student.hbm.xml
Course.java
public class Course {
private int id;
private String name;
private Set<Student> students;
//get、set省略
}
Course.hbm.xml
- 添加数据:如果原来是单边配置,现在改成双边配置ManyToMany,原来的表数据不会改变,只是表结构多了一个关系,所以不需要担心原来的数据会改变。
public void testAdd(){
Course c1 = new Course();
c1.setName("Java");
Course c2 = new Course();
c2.setName("C#");
Set<Course> set = new HashSet<Course>();
set.add(c1);
set.add(c2);
Student s1 = new Student();
s1.setName("Tom");
s1.setCourses(set);
Student s2 = new Student();
s2.setName("Jack");
s2.setCourses(set);
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(c1);
session.save(c2);
session.save(s1);
session.save(s2);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 查学号为1的学生所选的课程
public void testLoad(){
Student s = new Student();
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
s = (Student)session.load(Student.class, 1);
System.out.println("Student Name:"+s.getName());
for(Course c: s.getCourses()){
System.out.println("Course Name:"+c.getName());
}
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 查课程号为1的课有哪些学生
public void testLoad2(){
Course c = new Course();
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
c = (Course)session.load(Course.class, 1);
System.out.println("Course Name:"+c.getName());
for(Student s: c.getStudents()){
System.out.println("Student Name:"+s.getName());
}
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}