关系映射多对多详解

来源:互联网 发布:知乎账号 已注销 编辑:程序博客网 时间:2024/06/11 22:03

关系映射多对多

一.             多对多:学生和老师是一个典型的多对多事例;在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。

二.现对表进行一下简单的分析

 

 

 

 

 

 

 

 

 

 

三.单向:

    在维持关系一端的映射文件中加入:

<hibernate-mapping

    package="com.hbsi.domain">

 

    <class name="Student" table="student">

       <id name="id"column="id">

           <generator class="native"/>

       </id>

       <property name="name"/>

       <set name="teachers"table="teacher_student"> <!-- table是用来指定中间表的属性 -->

           <key column="student_id"></key> <!-- 查找学生id时,链接中间表表的student_id -->

       <many-to-many class="Teacher"column="teacher_id"/>

       </set>

    </class>

</hibernate-mapping>

 

         双向:

       在两边都要加入相对的配置信息:

四.测试

package com.hbsi.test;

 

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

 

import org.hibernate.Session;

import org.hibernate.Transaction;

 

import com.hbsi.domain.Deparment;

import com.hbsi.domain.Employee;

import com.hbsi.domain.Student;

import com.hbsi.domain.Teacher;

import com.hbsi.hibernate.utils.HibernateUtil;

 

public class Many2Many {

    public static void main(String[] args) {

       add();

       query(1);

    }

   

   

    public static void add(){

      

       Session s=null;

       Transaction tx=null;

       try{

           s= HibernateUtil.getSession();

           tx=s.beginTransaction();

           //增加

           Teacher t1=new Teacher();

           t1.setName("T1");

           Teacher t2=new Teacher();

           t2.setName("T2");

          

          

           Student s1=new Student();

           s1.setName("s1");

           Student s2=new Student();

           s2.setName("s2");

          

          

           Set<Student> ss=new HashSet<Student>();

           ss.add(s1);

           ss.add(s2);

           //如果注释了下面两句话,不会错但是没有了关联

           t1.setStudents(ss);

           t2.setStudents(ss);

          

           //语句报错主键不能重复,写一方就行了

//         Set<Teacher> ts=new HashSet<Teacher>();

//         ts.add(t1);

//         ts.add(t2);

//        

//         s1.setTeachets(ts);

//         s1.setTeachets(ts);

          

           s.save(t1);

           s.save(t2);

           s.save(s1);

           s.save(s2);

          

          

          

          

          

           tx.commit();

          

          

       }finally{

           if(s!=null)

              s.close();

       }

      

    }

    public static void query(int teacherId){

       Session s=null;

       Transaction tx=null;

       try{

           s= HibernateUtil.getSession();

           tx=s.beginTransaction();

          

           Teacher t=(Teacher) s.get(Teacher.class,teacherId);

       System.out.println(t.getName());

       System.out.println(" 教授教授的学生 ");

       Iterator<Student> it=t.getStudents().iterator();

       while(it.hasNext()){

           Student stu= it.next();

           System.out.println(stu.getName());

          

       Student ts= (Student) s.get(Student.class,teacherId);

           System.out.println(ts.getName());

           System.out.println("学生被那个老师教了 ");

           Iterator<Teacher> its=ts.getTeachers().iterator();

           while(its.hasNext()){

              Teacher teach= its.next();

              System.out.println(teach.getName());

             

           }

          

       }

          

          

          

       }finally{

           if(s!=null)

              s.close();

       }

      

    }

}

   

      

      

      

   

 

 

 

原创粉丝点击