hibernate映射关系之多对多(一)

2014-11-24 01:37:20 · 作者: · 浏览: 2
多对多:
* 关系在第三张表中,和两张表本身没有关系
* 多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面
来体现
* 关系体现:

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

course类对应的映射文件

  


  

  
    
    
     
      
      
     
     
     
     
     
      
       
      
      
     
   

  

student表对应的映射文件

  


  

  
    
    
     
      
      
     
     
     
     
     
      
       
      
      
     
   

  

多对多情况示例

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
  
    students = new HashSet
   
    (); 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
    
      courses = new HashSet
     
      (); courses.add(course); /** * 新建学生 */ Student student = new Student(); student.setSname("班长"); student.setDescription("高手,元方,你怎么看 "); /* * 通