源码地址:https://github.com/weiliangchun/JavaCode/tree/master/hibernateImooc/2-1Hibernate-many2many

第一章 多对多的应用场景

案例

企业项目开发过程中

  • 一个项目可由多个员工参与开发
  • 一个员工可同时参与开发多个项目

多对多关联(many-to-many)

  • 多对多关联也是常见的一种关联关系,如项目和员工之间就是典型的多对多关系
  • 多对多关联关系一般采用中间表的形式来实现,即新增一张包含关联双方主键的关联表
  • 多对多关联可以使用元素和元素进行配置

第二章 多对多的映射配置案例

2-1 创建项目和表

create table project
(
    proid int primary key,
    proname varchar(20) not null
);
create table employee
(
    empid int primary key,
    empname varchar(20)
);
create table proemp
(
    rproid int,
    rempid int
);
alter table proemp add constraint fk_rproid
    foreign key (rproid) references project(proid);
alter table proemp add constraint fk_rempid
    foreign key (rempid) references employee(empid);

2-2 创建持久化类和映射文件

Project类

public class Project {
    private int proid;
    private String proname;
    // 添加一个员工的集合
    private Set<Employee> employees = new HashSet<Employee>();

    ...

}

Employee类

public class Employee {
    private int empid;
    private String empname;
    // 添加一个项目的集合
    private Set<Project> projects = new HashSet<Project>();

    ...

}

2-3 配置映射文件

Project.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-10-12 15:32:10 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="cc.wlc.entity.Project" table="project">
        <id name="proid" column="proid" type="java.lang.Integer">
            <generator class="assigned"/>
        </id>
        <property name="proname" type="java.lang.String">
            <column name="proname" length="20" not-null="true"/>
        </property>
        <!-- 配置多对多关联关系 -->
        <set name="employees" table="proemp" cascade="all">
            <key column="rproid"></key>
            <many-to-many class="cc.wlc.entity.Employee" column="rempid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

Employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-10-12 15:32:10 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="cc.wlc.entity.Employee" table="employee">
        <id name="empid" type="int">
            <column name="empid" />
            <generator class="assigned" />
        </id>
        <property name="empname" type="java.lang.String">
            <column name="empname" lenght="20" not-null="true"/>
        </property>
        <set name="projects" table="proemp" inverse="true" lazy="true">
            <key>
                <column name="rempid" />
            </key>
            <many-to-many class="cc.wlc.entity.Project" column="rproid"/>
        </set>
    </class>
</hibernate-mapping>

2-4 测试

package cc.wlc.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import cc.wlc.entity.Employee;
import cc.wlc.entity.Project;
import cc.wlc.util.HibernateUtil;

/*
 * 多对多关联关系的配置
 * 同时建立了Project到Employee之间的双向多对多的关系
 * 关联关系的维护交由Project方来处理,并且在保存Project对象时会一并保存Employee对象
 */
public class Test {
    public static void main(String[] args){
        Project project1 = new Project(1001,"项目一");
        Project project2 = new Project(1002,"项目二");
        Employee employee1 = new Employee(1,"小明");
        Employee employee2 = new Employee(2,"小红");

        //参加项目一的员工有:小明、小红
        project1.getEmployees().add(employee1);
        project1.getEmployees().add(employee2);
        //参加项目二的员工有:小明
        project2.getEmployees().add(employee1);

        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        session.save(project1);
        session.save(project2);
        tx.commit();
        HibernateUtil.closeSession(session);
    }
}

第三章 总结

  • 实现多对多关联关系
  • 在数据库底层通过添加中间表来指定关联关系
  1. 在双方的实体中添加一个保存对方的集合
  2. 在双方的映射文件中使用元素和元素进行关联关系的配置

hibernate之多对多映射的更多相关文章

  1. Hibernate的多对一映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...

  2. Hibernate的多对多映射关系

    example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...

  3. hibernate单向多对一映射

    n21: 1.new 两个实体类,一个代表"多"的一端,一个代表"一"的一端. Customer类: public class Customer { priva ...

  4. hibernate 2 多对多映射

    一.实体类 1.Classes.java package cn.gs.wwg.entity; import java.util.Set; public class Classes { private ...

  5. Hibernate的多对多映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...

  6. Hibernate(八)多对多映射

    一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...

  7. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  8. 【Hibernate框架】关联映射(一对多,多对一)

    根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...

  9. hibernate笔记--单(双)向的多对多映射关系

    在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...

随机推荐

  1. codevs1230元素查找(hash)

    1230 元素查找  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个 ...

  2. [Swift通天遁地]五、高级扩展-(7)UIView(视图类型)的各种扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. Java8080端口被占用解决办法

    netstat -ano | findstr 8080 taskkill -pid 3196-f

  4. 大圆那些事 LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

    LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别 LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY ...

  5. 【LeetCode】-- 260. Single Number III

    问题描述: https://leetcode.com/problems/single-number-iii/ 在一个数组里面,只有两个元素仅出现过1次,其余都出现过两次.找出出现仅一次的那两个(a, ...

  6. NPOI复制模板导出Excel

    本人菜鸟实习生一枚,公司给我安排了一个excel导出功能.要求如下:1.导出excel文件有样式要求:2.导出excel包含一个或多个工作表:3.功能做活(我的理解就是excel样式以后可能会变方便维 ...

  7. iOS动画——DynamicAnimate

    力学动画 以dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的.其中包含了重力.碰撞.推.甩.和自定义行为. 涉及到的类如 ...

  8. PHP第二阶段学习 一、php的基本语法

    php的基本语法 输出语句:a.  echo输出:可以输出多个字符串,逗号隔开 b.  print输出:只能输出一个字符串,返回true或false c.  print_r():可以把字符串和数字简单 ...

  9. 转载:使用FileReader对象的readAsDataURL方法来读取图像文件

    文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...

  10. 4th 循环结构概述和for语句的格式及其使用

    04.01_Java语言基础(循环结构概述和for语句的格式及其使用) A:循环结构的分类 for,while,do...while B:循环结构for语句的格式: for(初始化表达式;条件表达式; ...