Hibernate关联关系之多对多

Posted 波涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate关联关系之多对多相关的知识,希望对你有一定的参考价值。

多对多映射关系

建立多对多单向关联关系

创建Employee类:

1 public class Employee {
2     private Integer empid;  //员工编号
3     private String empname;  //员工姓名
4     private Set<Project> projects = new HashSet<Project>();  //植入项目集合
5 }

Employee.hbm.xml:

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomany">
 6     <!--实体 name=实体端的内容   column=DB端的内容-->
 7     <class name="Employee" table="EMPLOYEE" schema="liutao">
 8         <!--和底层数据表对应的主键   业务意义-->
 9         <id name="empid" column="EMPNO">
10            <generator class="native"></generator>
11         </id>
12         <property name="empname" column="EMPNAME"></property>
13         <set name="projects" table="REMPPRO">
14             <key column="REMPID"></key>
15             <many-to-many class="Project" column="RPROID"></many-to-many>
16         </set>
17     </class>
18 </hibernate-mapping>

属性详解:

name=类中植入的集合名称    table=中间表名称

<key  column=“本类在中间表的外键”></key>

<many-to-many class="映射类" column="映射类在中间表的外键"></many-to-many>

创建Project类 :

1 public class Project {
2     private Integer proid;
3     private String proname;
4 }

 Project.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomany">
 6     <!--实体 name=实体端的内容   column=DB端的内容-->
 7     <class name="Project" table="PROJECT" schema="liutao">
 8         <!--和底层数据表对应的主键   业务意义-->
 9         <id name="proid" column="PROID">
10            <generator class="native"></generator>
11         </id>
12         <property name="proname" column="PRONAME"></property>
13     </class>
14 </hibernate-mapping>

测试方法 

 1 //多对多 单向关联  添加一个员工对应多个工程
 2     @Test
 3     public void t2(){
 4         Session session = HibernateUtil.getSession();
 5         Transaction tx=session.beginTransaction();
 6         Employee emp1=new Employee();
 7         emp1.setEmpname("曹梅花");
 8         Project pro1=new Project();
 9         pro1.setProname("海淀花园");
10         Project pro2=new Project();
11         pro2.setProname("三国统治");
12 
13         emp1.getProjects().add(pro1);
14         emp1.getProjects().add(pro2);
15 
16         session.save(emp1);
17         session.save(pro1);
18         session.save(pro2);
19         tx.commit();
20         session.close();
21     }

表结构

 

 

 

 

 

建立多对多双向关联关系

Employee.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomany">
 6     <!--实体 name=实体端的内容   column=DB端的内容-->
 7     <class name="Employee" table="EMPLOYEE" schema="liutao">
 8         <!--和底层数据表对应的主键   业务意义-->
 9         <id name="empid" column="EMPNO">
10            <generator class="native"></generator>
11         </id>
12         <property name="empname" column="EMPNAME"></property>
13         <set name="projects" table="REMPPRO" lazy="true">
14             <key column="REMPID"></key>
15             <many-to-many class="Project" column="RPROID"></many-to-many>
16         </set>
17     </class>
18 </hibernate-mapping>

Project.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomany">
 6     <!--实体 name=实体端的内容   column=DB端的内容-->
 7     <class name="Project" table="PROJECT" schema="liutao">
 8         <!--和底层数据表对应的主键   业务意义-->
 9         <id name="proid" column="PROID">
10            <generator class="native"></generator>
11         </id>
12         <property name="proname" column="PRONAME"></property>
13         <set name="employees" table="REMPPRO" lazy="true">
14             <key column="RPROID"></key>
15             <many-to-many class="Employee" column="REMPID"></many-to-many>
16         </set>
17     </class>
18 </hibernate-mapping>

测试方法 

 1   //多对多双向  查询指定工程参与人员
 2     //查询员工所属工程
 3     @Test
 4     public void t3(){
 5         Session session = HibernateUtil.getSession();
 6         Transaction tx=session.beginTransaction();
 7         Project project = session.load(Project.class, 42);
 8         System.out.println(project.getProname());
 9         for (Employee item:project.getEmployees()
10              ) {
11             System.out.println(item.getEmpname());
12         }
13         tx.commit();
14         session.close();
15     }

执行结果

 

建立多对多双向关联 拆成两个多对一

Employee
1 //员工实体
2 public class Employee {
3     private Integer empid;  //员工编号
4     private String empname;  //员工姓名
5     private Set<Project> projects = new HashSet<Project>();  //植入项目集合
6 }

Employee.hbm.xml

 1 ?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomanydoublebyonetomany">
 6     <!--实体 name=实体端的内容   column=DB端的内容-->
 7     <class name="Employee" table="EMPLOYEE" schema="liutao">
 8         <!--和底层数据表对应的主键   业务意义-->
 9         <id name="empid" column="EMPNO">
10            <generator class="native"></generator>
11         </id>
12         <property name="empname" column="EMPNAME"></property>
13         <set name="projects" table="REMPPRO">
14             <key column="REMPID"></key>
15             <many-to-many class="Project" column="RPROID"></many-to-many>
16         </set>
17     </class>
18 </-mapping>

ProEmp

1 public class ProEmp {
2     private Integer id;
3     private Project pro;
4     private Employee emp;
5 }

ProEmp.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomanydoublebyonetomany">
 6     <class name="ProEmp" table="PROEMP">
 7         <id name="id" column="ID">
 8             <generator class="native"></generator>
 9         </id>
10         <many-to-one name="emp" class="Employee">
11             <column name="empid"></column>
12         </many-to-one>
13         <many-to-one name="pro" class="Project">
14             <column name="proid"></column>
15         </many-to-one>
16     </class>
17 </hibernate-mapping>

Project

1 public class Project {
2     private Integer proid;
3     private String proname;
4     private Set<Employee> employees=new HashSet<Employee>();
5 }

Project.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="cn.hibernate.day04mapping.manytomanydoublebyonetomany">
 6     <!--实体 name=实体端的内容   column=DB端的内容-->
 7     <class name="Project" table="PROJECT" schema="liutao">
 8         <!--和底层数据表对应的主键   业务意义-->
 9         <id name="proid" column="PROID">
10            <generator class="native"></generator>
11         </id>
12         <property name="proname" column="PRONAME"></property>
13         <set name="employees" table="REMPPRO" lazy="true">
14             <key column="RPROID"></key>
15             <many-to-many class="Employee" column="REMPID"></many-to-many>
16         </set>
17     </class>
18 </hibernate-mapping>

单元测试:

 1 //多对多双向关联  拆分成两个多对一  添加
 2 @Test
 3 public void t4(){
 4     Session session = HibernateUtil.getSession();
 5     Transaction tx=session.beginTransaction();
 6     //创建EMP对象
 7     Employee emp=new Employee();
 8     emp.setEmpname("李小龙");
 9 
10     //创建Pro对象
11     Project pro=new Project();
12     pro.setProname("海淀花园");
13 
14     //创建ProEmp对象
15     ProEmp proemp=new ProEmp();
16     proemp.setEmp(emp);
17     proemp.setPro(pro);
18 
19     session.save(emp);
20     session.save(pro);
21     session.save(proemp);
22     // 事务提交
23     tx.commit();
24     session.close();
25     System.out.println("成功");
26 }

 

以上是关于Hibernate关联关系之多对多的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 的 关联关系之多对多 和 延迟加载

hibernate关联映射之多对多

hibernate 表关系映射详解之多对多

Mybatis之关联关系(一对多多对多)

Hibernate框架进阶(中篇)之多表关系

Hibernate的多对多关联关系