多对多映射关系

建立多对多单向关联关系

创建Employee类:

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

Employee.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="cn.hibernate.day04mapping.manytomany">
<!--实体 name=实体端的内容 column=DB端的内容-->
<class name="Employee" table="EMPLOYEE" schema="liutao">
<!--和底层数据表对应的主键 业务意义-->
<id name="empid" column="EMPNO">
<generator class="native"></generator>
</id>
<property name="empname" column="EMPNAME"></property>
<set name="projects" table="REMPPRO">
<key column="REMPID"></key>
<many-to-many class="Project" column="RPROID"></many-to-many>
</set>
</class>
</hibernate-mapping>

属性详解:

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

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

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

创建Project类 :

 public class Project {
private Integer proid;
private String proname;
}

Project.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="cn.hibernate.day04mapping.manytomany">
<!--实体 name=实体端的内容 column=DB端的内容-->
<class name="Project" table="PROJECT" schema="liutao">
<!--和底层数据表对应的主键 业务意义-->
<id name="proid" column="PROID">
<generator class="native"></generator>
</id>
<property name="proname" column="PRONAME"></property>
</class>
</hibernate-mapping>

测试方法

 //多对多 单向关联  添加一个员工对应多个工程
@Test
public void t2(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Employee emp1=new Employee();
emp1.setEmpname("曹梅花");
Project pro1=new Project();
pro1.setProname("海淀花园");
Project pro2=new Project();
pro2.setProname("三国统治"); emp1.getProjects().add(pro1);
emp1.getProjects().add(pro2); session.save(emp1);
session.save(pro1);
session.save(pro2);
tx.commit();
session.close();
}

表结构

建立多对多双向关联关系

Employee.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="cn.hibernate.day04mapping.manytomany">
<!--实体 name=实体端的内容 column=DB端的内容-->
<class name="Employee" table="EMPLOYEE" schema="liutao">
<!--和底层数据表对应的主键 业务意义-->
<id name="empid" column="EMPNO">
<generator class="native"></generator>
</id>
<property name="empname" column="EMPNAME"></property>
<set name="projects" table="REMPPRO" lazy="true">
<key column="REMPID"></key>
<many-to-many class="Project" column="RPROID"></many-to-many>
</set>
</class>
</hibernate-mapping>

Project.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="cn.hibernate.day04mapping.manytomany">
<!--实体 name=实体端的内容 column=DB端的内容-->
<class name="Project" table="PROJECT" schema="liutao">
<!--和底层数据表对应的主键 业务意义-->
<id name="proid" column="PROID">
<generator class="native"></generator>
</id>
<property name="proname" column="PRONAME"></property>
<set name="employees" table="REMPPRO" lazy="true">
<key column="RPROID"></key>
<many-to-many class="Employee" column="REMPID"></many-to-many>
</set>
</class>
</hibernate-mapping>

测试方法

   //多对多双向  查询指定工程参与人员
//查询员工所属工程
@Test
public void t3(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Project project = session.load(Project.class, 42);
System.out.println(project.getProname());
for (Employee item:project.getEmployees()
) {
System.out.println(item.getEmpname());
}
tx.commit();
session.close();
}

执行结果

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

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

Employee.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="cn.hibernate.day04mapping.manytomanydoublebyonetomany">
<!--实体 name=实体端的内容 column=DB端的内容-->
<class name="Employee" table="EMPLOYEE" schema="liutao">
<!--和底层数据表对应的主键 业务意义-->
<id name="empid" column="EMPNO">
<generator class="native"></generator>
</id>
<property name="empname" column="EMPNAME"></property>
<set name="projects" table="REMPPRO">
<key column="REMPID"></key>
<many-to-many class="Project" column="RPROID"></many-to-many>
</set>
</class>
</-mapping>

ProEmp

 public class ProEmp {
private Integer id;
private Project pro;
private Employee emp;
}

ProEmp.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="cn.hibernate.day04mapping.manytomanydoublebyonetomany">
<class name="ProEmp" table="PROEMP">
<id name="id" column="ID">
<generator class="native"></generator>
</id>
<many-to-one name="emp" class="Employee">
<column name="empid"></column>
</many-to-one>
<many-to-one name="pro" class="Project">
<column name="proid"></column>
</many-to-one>
</class>
</hibernate-mapping>

Project

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

Project.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="cn.hibernate.day04mapping.manytomanydoublebyonetomany">
<!--实体 name=实体端的内容 column=DB端的内容-->
<class name="Project" table="PROJECT" schema="liutao">
<!--和底层数据表对应的主键 业务意义-->
<id name="proid" column="PROID">
<generator class="native"></generator>
</id>
<property name="proname" column="PRONAME"></property>
<set name="employees" table="REMPPRO" lazy="true">
<key column="RPROID"></key>
<many-to-many class="Employee" column="REMPID"></many-to-many>
</set>
</class>
</hibernate-mapping>

单元测试:

 //多对多双向关联  拆分成两个多对一  添加
@Test
public void t4(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
//创建EMP对象
Employee emp=new Employee();
emp.setEmpname("李小龙"); //创建Pro对象
Project pro=new Project();
pro.setProname("海淀花园"); //创建ProEmp对象
ProEmp proemp=new ProEmp();
proemp.setEmp(emp);
proemp.setPro(pro); session.save(emp);
session.save(pro);
session.save(proemp);
// 事务提交
tx.commit();
session.close();
System.out.println("成功");
}

Hibernate关联关系之多对多的更多相关文章

  1. hibernate关联关系(多对多)

    数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...

  2. Hibernate关联关系配置(一对多、一对一和多对多)

    第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的 ...

  3. Hibernate-ORM:12.Hibernate中的多对多关联关系

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ...

  4. (转)Hibernate框架基础——多对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...

  5. hibernate关联关系 (多对多)

    hibernate的多对多 hibernate可以直接映射多对多关联关系(看作两个一对多  多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删 ...

  6. hibernate关联关系的crud2

    hibernate关联关系的CRUD操作,解释都在注释里了,讲了fetchType.cascade. User类: package com.oracle.hibernate; import javax ...

  7. Hibernate中双向多对多的两种配置方式

    Hibernate中双向多对多的两种配置方式 1.建立多对多双向关联关系 package cn.happy.entitys; import java.util.HashSet; import java ...

  8. Hibernate ManyToOne Mappings 多对一关联映射

    Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...

  9. Hibernate 关联关系(一对多)

    Hibernate 关联关系(一对多) 1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B ...

随机推荐

  1. 数组练习题A财务管理

    第一次看全英文的题,还是有点不舒服的感觉,还是用了翻译器 Larry graduated this year and finally has a job. He's making a lot of m ...

  2. 华为设备默认console密码

    admin@huawei.com Admin@huawei.com Admin@huawei huawei.com huawei@123 huawei Change_Me

  3. XAML绑定到资源文件字符串时失败

    参考:https://stackoverflow.com/questions/19586401/error-in-binding-resource-string-with-a-view-in-wpf ...

  4. github协作开发遇到的问题

    1.十一来了,帝都不好买票,30号就调休一天回去了,项目还没搞完,紧张的不行,就自己和同事搞了一个github协作开发,由于是功能和公司项目不是很沾边,但是是自己的主要工作,就和同事协调了一下,搭建了 ...

  5. TagCanvas 插件

    TagCanvas是一个基于HTML5 Canvas技术开发的标签云动画.还提供一个以jQuery插件形式实现的版本. 它支持文本和图片两种格式,能够以Sphere, hcylinder 或 vcyl ...

  6. JavaScript学习:取数组中最大值和最小值

    在实际业务中有的时候要取出数组中的最大值或最小值.但在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最 ...

  7. WPF多屏最大化

    如果计算机存在多个显示器,这时设置wpf窗口为最大化,窗口只能在主显示器中实现最大化,如果想要实现窗口拉伸至多屏,需要获取所有显示器分辨率之和.这时用到了System.Windows.SystemPa ...

  8. Hankson 的趣味题

    题解: 硬是把一道傻逼题写到了200行.. 长长的模板就有70行.. 由于我没有做的时候觉得并不保证$a1|a0$ $b0|b1$ 然后就加了很多特判.. 我的做法就是暴力分解质因数 T*sqrt(n ...

  9. Fib数列2 费马小定理+矩阵乘法

    题解: 费马小定理 a^(p-1)=1(mod p) 这里推广到矩阵也是成立的 所以我们可以对(2^n)%(p-1) 然后矩阵乘法维护就好了 模数较大使用快速乘

  10. Spring Security 架构与源码分析

    Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowe ...