hibernate之多对多映射
源码地址: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);
}
}
第三章 总结
- 实现多对多关联关系
- 在数据库底层通过添加中间表来指定关联关系
- 在双方的实体中添加一个保存对方的集合
- 在双方的映射文件中使用元素和元素进行关联关系的配置
hibernate之多对多映射的更多相关文章
- Hibernate的多对一映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- Hibernate的多对多映射关系
example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...
- hibernate单向多对一映射
n21: 1.new 两个实体类,一个代表"多"的一端,一个代表"一"的一端. Customer类: public class Customer { priva ...
- hibernate 2 多对多映射
一.实体类 1.Classes.java package cn.gs.wwg.entity; import java.util.Set; public class Classes { private ...
- Hibernate的多对多映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- Hibernate(八)多对多映射
一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- hibernate笔记--单(双)向的多对多映射关系
在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...
随机推荐
- eclipse的快捷键---调试
1:查看类或接口的方法 Ctrl+T 2:debug调试查看信息 Ctrl+Shift+i 3:debug调试快捷键 (1):F11好像是重新运行debug. (2):F8直接输出结果.(3):F5单 ...
- nodejs操作mysql
var mysql = require('mysql');var pool = mysql.createPool({ host: 'localhost', user: 'root', password ...
- 【原创】Vue项目中各种功能的实现
已完成: 后台的管理功能: 这里用的组件是 element-UI ====> NavMenu ◆首先是排版 : <div class="manage-page fillcont ...
- NS2学习笔记(五)
对无线网络,生成nam文件要使用namtrace-all-wireless, 而不是namtrace-all: set nf [open test_1.nam w] $ns_ namtrace-all ...
- ACM_水题你要信了(修改版)
水题你要信了 Time Limit: 2000/1000ms (Java/Others) Problem Description: 某发最近又认识了很多妹(han)子,可是妹(han)子一多不免有时会 ...
- Oracle 递归的写法(start with) 以及where条件作用域
先转一个讲Oracle递归讲得非常透彻的文章: http://blog.csdn.net/weiwenhp/article/details/8218091 前言:嗯,这也是一个前人挖坑,后人来填的故事 ...
- C语言关键字之sizeof
C语言关键字 sizeof 是一个操作符,返回对象或类型所占内存字节数,类型为size_t(定义在<stddef.h>),有2种用法: sizeof unary-expression si ...
- Android FileProvider相关 Failed to find configured root that contains
问题: 使用FileProvider构造SD卡中文件uri时异常 java.lang.IllegalArgumentException: Failed to find configured root ...
- HTTP05--HTML常用知识
一.URL地址含义 需要搞清URL和URI的差别,以及QueryString的含义. 二.GET和POST的区别 详细介绍可参考文章:http://zengrong.net/post/1802.htm ...
- JS高级——歌曲管理
1.将歌曲管理的CURD方法放到原型中 2.在构造函数中,我们只有一个属性是songList,因为音乐库不是共有的,如果将songList放入原型中,任何一个人的一次修改songList,都将把son ...