多对多:
* 关系在第三张表中,和两张表本身没有关系
*
多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面
来体现
*
关系体现:
第三张表的维护:增加、删除
course类对应的映射文件
<?xml version="1.0"
encoding="utf-8"?>
<!--
Mapping file autogenerated by MyEclipse
Persistence Tools
-->
<HIBERNATE-MAPPING>
<CLASS
name="manytomany.Course">
<ID name="cid" length="5"
type="java.lang.Long">
<COLUMN
name="cid"></COLUMN>
<GENERATOR
class="increment"></GENERATOR>
</ID>
<property
name="cname" length="50"
type="java.lang.String"></property>
<property
name="description" length="50"
type="java.lang.String"></property>
<!--
table
指的是多对多的第三张表
-->
<SET name="students" inverse="true"
cascade="save-update"
table="student_course">
<KEY>
<COLUMN
name="cid"></COLUMN>
</KEY>
<MANY-TO-MANY
class=.manytomany.Student
column="sid"></MANY-TO-MANY>
</SET>
</CLASS>
</HIBERNATE-MAPPING>
student表对应的映射文件
<?xml
version="1.0" encoding="utf-8"?>
<!--
Mapping file autogenerated
by MyEclipse Persistence
Tools
-->
<HIBERNATE-MAPPING>
<CLASS
name="manytomany.Student">
<ID name="sid" length="5"
type="java.lang.Long">
<COLUMN
name="sid"></COLUMN>
<GENERATOR
class="increment"></GENERATOR>
</ID>
<property
name="sname" length="50"
type="java.lang.String"></property>
<property
name="description" length="50"
type="java.lang.String"></property>
<!--
table
指的是多对多的第三张表
-->
<SET name="course" cascade="save-update"
table="student_course">
<KEY>
<COLUMN
name="sid"></COLUMN>
</KEY>
<MANY-TO-MANY
class="manytomany".Course
column="cid"></MANY-TO-MANY>
</SET>
</CLASS>
</HIBERNATE-MAPPING>
多对多情况示例
import
java.lang.annotation.Target;
import java.util.HashSet;
import
java.util.Set;
import org.hibernate.Session;
import
org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import
org.hibernate.cfg.Configuration;
import org.junit.Test;
/**
*
1、保存课程
* 2、保存学生
* 3、保存课程的时候同时保存学生
*
4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系
* 5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
*
6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
*
7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
*
8、已经存在一个学生,解除该学生和该学生所在班级之间的关系 www.yzyxedu.com
* 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
*
10、解除该班级和所有的学生之间的关系
* 11、删除班级
* *
* * 解除该班级和所有的学生之间的关系
* *
删除该班级
* *
* 删除班级的同时删除学生
* 12、删除学生
* 同删除班级
* @author
Administrator
*
*/
public class ManyToManyTest {
private
static SessionFactory sessionFactory = null;
static{
Configuration
configuration = new
Configuration();
configuration.configure("cn/itcast/hibernate0909/manytomany/hibernate.cfg.xml");
sessionFactory
= configuration.buildSessionFactory();
}
/**
*
保存课程
*/
@Test
public void testSaveCourse(){
Session session
= sessionFactory.openSession();
Transaction transaction =
session.beginTransaction();
Course course = new
Course();
course.setCname("生理卫生");
course.setDescription("讲得都是讲卫生的");
session.save(course);
transaction.commit();
session.close();
}
/**
*
保存学生
*/
@Test
public void testSaveStudent(){
Session session
= sessionFactory.openSession();
Transaction transaction =
session.beginTransaction();
Student student = new
Student();
student.setSname("里活命");
student.setDescription("UFO");
session.save(student);
transaction.commit();
session.close();
}
/**
*
保存课程同时保存学生
* Hibernate: select max(cid) from Course
Hibernate: select
max(sid) from Student
Hibernate: insert into Course (cname, description,
cid) values (?, ?, ?)
Hibernate: insert into Student (sname, description,
sid) values (?, ?,
?)
往Course表和Student表中分别插入了一行数据,和关系表没有关系
通过映射文件可以看出,Student维护关系,但是从代码中找不到维护关系的代码
*/
@Test
public
void testSaveCourse_Cascade(){
Session session =
sessionFactory.openSession();
Transaction transaction =
session.beginTransaction();
/*
* 新建一个课程
*/
Course course =
new
Course();
course.setCname("java基础");
course.setDescription("讲课");
/**
*
新建一个学生
*/
Student student = new
Student();
student.setSname("得意门生:西门庆");
student.setDescription("高手");
Set<STUDENT>
students = new
HashSet<STUDENT>();
students.add(student);
/**
*
通过课程建立课程与学生之间的关系
*/
course.setStudents(students);//因为课程是一个新的,所以根据没有学生
session.save(course);
transaction.commit();
session.close();
}
/**
*
保存课程同时保存学生,并且建立关系
*/
@Test
public void
testSaveCourse_Cascade_R(){
Session session =
sessionFactory.openSession();
Transaction transaction =
session.beginTransaction();
/**
* 新建课程
*/
Course course =
new
Course();
course.setCname("java高级");
course.setDescription("专讲框架,由金云龙代课");
Set<COURSE>
courses = new HashSet<COURSE>();
courses.add(course);
/**
*
新建学生
*/
Student student = new
Student();
student.setSname("班长");
student.setDescription("高手,元方,你怎么看?");
/*
*
通过学生建立学生和课程之间的关系
*/
student.setCourse(courses);
session.save(student);
transaction.commit();
session.close();
}
/**
*
已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
* Hibernate: select course0_.cid as
cid0_0_, course0_.cname as cname0_0_, course0_.description as descript3_0_0_
from Course course0_ where course0_.cid=?
Hibernate: select max(sid) from
Student www.yzyedu.com
Hibernate: insert into Student (sname, description, sid) values (?, ?,
?)
Hibernate: insert into student_course (sid, cid) values (?,
?)
该sql语句是维护关系
*/
@Test
public void
testSaveStudent_R(){
Session session =
sessionFactory.openSession();
Transaction transaction =
session.beginTransaction();
/**
* 1、查找一个课程
* 2、新建一个学生
*
3、通过学生来维护该学生和课程之间的关系
*/
//查找课程2
Course course =
(Course)session.get(Course.class, 2L);
//新建一个学生
Student student = new
Student();
student.setSname("意门生");
student.setDescription("aa");
//通过学生来维护该学生和课程之间的关系
Set<COURSE>
courses = new
HashSet<COURSE>();
courses.add(course);
student.setCourse(courses);
session.save(student);
transaction.commit();
session.close();
}
/**
*
已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
*/
@Test
public void
testSaveCourse_R(){
Session session =
sessionFactory.openSession();
Transaction transaction =
session.beginTransaction();
/**
* 1、新建一个课程
* 2、查找学生托福答案
*
3、在学生原来的基础上新添加一门课程
*/
//新建课程
Course course = new
Course();
course.setCname("项目课");
course.setDescription("得意门生");
//查找学生
Student
student = (Student)session.get(Student.class, 5L);
Set<COURSE>
courses =
student.getCourse();//获取该学生现在所有的课程
courses.add(course);
transaction.commit();
session.close();
}
}