hibernate映射关系之多对多

多对多:
  *  关系在第三张表中,和两张表本身没有关系
  *  多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面
     来体现
  *  关系体现:

        第三张表的维护:增加、删除

course类对应的映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="manytomany.Course">
    	<id name="cid" type="java.lang.Long" length="5">	
    		<column name="cid"></column>
    		<generator class="increment"></generator>
    	</id>
    	
    	<property name="cname" type="java.lang.String" length="50"></property>
    	
    	<property name="description" type="java.lang.String" length="50"></property>
    	
    	<!-- 
    		table 指的是多对多的第三张表
    	 -->
    	<set name="students" table="student_course" cascade="save-update" inverse="true">
    		<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"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="manytomany.Student">
    	<id name="sid" type="java.lang.Long" length="5">	
    		<column name="sid"></column>
    		<generator class="increment"></generator>
    	</id>
    	
    	<property name="sname" type="java.lang.String" length="50"></property>
    	
    	<property name="description" type="java.lang.String" length="50"></property>
    	
    	<!-- 
    		table 指的是多对多的第三张表
    	 -->
    	<set name="course" table="student_course" cascade="save-update">
    		<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、已经存在一个学生,解除该学生和该学生所在班级之间的关系
 * 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
			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();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值