Hibernate的关系映射多对多

来源:互联网 发布:linux php安装方式 编辑:程序博客网 时间:2024/05/22 17:43
 

Hibernate的关系映射多对多

       在这里我以学生和老师为例,实现多对多的关系,学生可以有多个老师教,当然老师也可以教多个学生,所以我这里以老师和学生实现多对多的关联。

       在多对多关系模型中是无法直接表达两个表之间的多对多关联的。需要一个中间连接表,在中间连接表中用外键关联到两个表中。

 

Domain层的创建:

       建立Teacher实体类:

              public class Teacher {

   private Integer id;

   private String name;

   private Set<Student> students;

   public Integer getId() {

      return id;

   }

   public void setId(Integer id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public Set<Student> getStudents() {

      return students;

   }

   public void setStudents(Set<Student> students) {

      this.students = students;

   }

  

}

 

Student实例类的创建

       public class Student {

   private Integer id;

   private String name;

   private Set<Teacher> teachers;

  

   public Integer getId() {

      return id;

   }

   public void setId(Integer id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public Set<Teacher> getTeachers() {

      return teachers;

   }

   public void setTeachers(Set<Teacher> teachers) {

      this.teachers = teachers;

   }

  

}

 

映射文件的创建:

 

一、            单向多对多

Teacher映射文件:Teacher.hbm.xml

       <?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping package="com.hbsi.domain">

   <class name="Teacher" table="teacher">   //映射持久化类

      <id name="id">   //映射对象标识符

        <generator class="native" />

      </id>

      <property name="name"/>

      <set name="students" table="teacher_student"><!-- table属性指定中间表的名字 -->

        <key column="teacher_id"/>

        <many-to-many class="Student" column="student_id"/>

      </set>

   </class>

</hibernate-mapping>

 

       Student映射文件:Student.hbm.xml

              <?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping package="com.hbsi.domain">

 

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

      <id name="id">

        <generator class="native" />

      </id>

      <property name="name"/>

   </class>

</hibernate-mapping>

 

二、双向多对多:
              Teacher映射文件:Teacher.hbm.xml

       <?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping package="com.hbsi.domain">

   <class name="Teacher" table="teacher">   //映射持久化类

      <id name="id">   //映射对象标识符

        <generator class="native" />

      </id>

      <property name="name"/>

      <set name="students" table="teacher_student"><!-- table属性指定中间表的名字 -->

        <key column="teacher_id"/>

        <many-to-many class="Student" column="student_id"/>

      </set>

   </class>

</hibernate-mapping>

 

       Student映射文件:Student.hbm.xml

       <?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping package="com.hbsi.domain">

 

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

      <id name="id">

        <generator class="native" />

      </id>

      <property name="name"/>

      <set name="teachers" table="teacher_student">

        <key column="student_id"/>

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

      </set>

   </class>

</hibernate-mapping>

 

配置文件的代码示例:

      

<!DOCTYPE hibernate-configuration PUBLIC

   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

 

<hibernate-configuration>

   <session-factory name="foo">

      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

      <property name="connection.url">jdbc:mysql:///demo</property>

      <property name="hibernate.connection.username">root</property>

      <property name="connection.password">123</property>

      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

      <property name="hibernate.hbm2ddl.auto">update</property>

      <property name="hibernate.show_sql">true</property>

     

      <mapping resource="com/hbsi/domain/Teacher.hbm.xml"/>

      <mapping resource="com/hbsi/domain/Student.hbm.xml"/>

   </session-factory>

</hibernate-configuration>

 

包的导入:

      

工具包的编写:

       public final class HibernateUtil {

   private static SessionFactory sessionFactory;

   private HibernateUtil(){

     

   }

   static{

      Configuration cfg=new Configuration();

      cfg.configure();

      sessionFactory=cfg.buildSessionFactory();

   }

   public static SessionFactory getSessionFactory() {

      return sessionFactory;

   }

   public static Session getSession(){

      return sessionFactory.openSession();

   }

  

   //查找

   public static Object get(Class clazz,int id) {

      Session session = null;

 

      try {

        session = HibernateUtil.getSession();

        Object obj=session.get(clazz, id);

        return obj;

 

      } finally {

        if (session != null) {

           session.close();

        }

      }

   }

   //删除

   public static void delete(Object obj){

      Session session = null;

      Transaction tx = null;

      try {

        session = HibernateUtil.getSession();

        tx = session.beginTransaction();

       

        session.delete(obj);

        tx.commit();

 

      } finally {

        if (session != null) {

            session.close();

        }

      }

     

   }

   //更新

   public static void update(Object obj) {

      Session session = null;

      Transaction tx = null;

      try {

        session = HibernateUtil.getSession();

        tx = session.beginTransaction();

       

        session.update(obj);

        tx.commit();

 

      } finally {

        if (session != null) {

           session.close();

        }

      }

   }

   //添加

   public static void addUser1(Object obj) {

      Session session = null;

      Transaction tx = null;

 

      try {

        session = HibernateUtil.getSession();

        tx = session.beginTransaction();

 

        session.save(obj);

        tx.commit();

 

      } finally {

        if (session != null) {

           session.close();

        }

      }

   }

  

}

 

 

测试类的实现:

       public class ManyToMany {

   public static void main(String[] args){

      add();

      //query(1);

   }

   static void add(){

      Session session=null;

      Transaction tx=null;

      try{

        session=HibernateUtil.getSession();

        tx=session.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.setTeachers(ts);

        s2.setTeachers(ts);*/

       

        session.save(t1);

        session.save(t2);

        session.save(s1);

        session.save(s2);

        tx.commit();

       

      }finally{

        if(session!=null){

           session.close();

        }

      }

     

   }

   public static void query(int id){

      Session session=null;

      try{

        session=HibernateUtil.getSession();

       

        /*Teacher t= (Teacher) session.get(Teacher.class, id);

        System.out.println("教师姓名:"+t.getName());

        System.out.println("学生成绩表:");

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

        while(it.hasNext()){

           Student student=it.next();

           System.out.println(student.getName()+"    ");

        }*/

        Student s=(Student) session.get(Student.class, id);

        System.out.println("学生姓名:"+s.getName());

        System.out.println("教师表:");

        Iterator<Teacher> it=s.getTeachers().iterator();

        while(it.hasNext()){

           Teacher teacher=it.next();

           System.out.println(teacher.getName()+"    ");

        }

      }finally{

        if(session!=null){

           session.close();

        }

      }

   }

}

 

原创粉丝点击