hibernate_04_hibernate多对多的关系映射
1.实体类的多对多的关系映射
一个用户可以有多个角色
User.java
public class User {
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private String user_state;
// 设置多对多关系:表示一个用户选择多个角色?
// 放置的是角色的集合
private Set<Role> roles = new HashSet<Role>();
}
Role.java
public class Role {
private Long role_id;
private String role_name;
private String role_memo;
// 一个角色被多个用户选择:
// 放置的是用户的集合
}
2.映射文件的多对多的关系映射
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.work.entity.User" table="sys_user">
<!-- 建立OID与主键的映射 -->
<id name="user_id" column="user_id">
<generator class="native"/>
</id>
<!-- 建立普通属性与字段映射 -->
<property name="user_code" column="user_code"/>
<property name="user_name" column="user_name"/>
<property name="user_password" column="user_password"/>
<property name="user_state" column="user_state"/>
<!-- 建立与角色的多对多的映射关系 -->
<!--
set标签
* name :对方的集合的属性名称。
* table :多对多的关系需要使用中间表,放的是中间表的名称。
-->
<set name="roles" table="sys_user_role" cascade="save-update,delete" >
<!--
key标签:
* column :当前的对象对应中间表的外键的名称。
-->
<key column="user_id"/>
<!--
many-to-many标签:
* class :对方的类的全路径
* column :对方的对象在中间表中的外键的名称。
-->
<many-to-many class="com.work.entity.Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>
LinkMan.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.work.entity.Role" table="sys_role">
<!-- 建立OID与主键的映射 -->
<id name="role_id" column="role_id">
<generator class="native"/>
</id>
<!-- 建立普通属性与字段的映射 -->
<property name="role_name" column="role_name"/>
<property name="role_memo" column="role_memo"/>
<!-- 与用户的多对多的映射关系 -->
<!--
set标签
* name :对方的集合的属性名称。
* table :多对多的关系需要使用中间表,放的是中间表的名称。
-->
<set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true">
<!--
key标签:
* column :当前的对象对应中间表的外键的名称。
-->
<key column="role_id"/>
<!--
many-to-many标签:
* class :对方的类的全路径
* column :对方的对象在中间表中的外键的名称。
-->
<many-to-many class="com.work.entity.User" column="user_id"/>
</set>
</class>
</hibernate-mapping>
3.多对多的级联操作
1>保存多个用户,每个用户有多个角色
必须有一方放弃主键的维护,一般都是被动的一方放弃
/**
* 多对多的级联保存
*/
@Test
public void save() { Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); User user1 = new User();
User user2 = new User(); user1.setUser_name("lq");
user2.setUser_name("xj"); Role role1 = new Role();
Role role2 = new Role();
Role role3 = new Role(); role1.setRole_name("开发部");
role2.setRole_name("研发部");
role3.setRole_name("传销部"); user1.getRoles().add(role1);
user1.getRoles().add(role2); user2.getRoles().add(role2);
user2.getRoles().add(role3); session.save(user1);
session.save(user2); tx.commit(); }
2>通过级联操作只需要对一方进行更新
保存级联操作:保存客户客户对应的联系人也保存了
/**
* 多对多的级联更新
*/
@Test
public void update() { Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); User user = session.get(User.class, 11L);
Role role = session.get(Role.class, 11L); //不需要跟新hibernate持久化状态的数据会自动更新到数据库
user.getRoles().add(role); tx.commit(); }
删除级联操作:删除用户用户对应的角色也删除了,而且角色对应的用户也会被删除(级联删除是不会使用的)
/**
* 多对多的级联删除
*/
@Test
public void delete() { Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); User user = session.get(User.class, 9L);
session.delete(user); tx.commit(); }
3>更新级联操作
@Test
public void update() { Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); //进行级联更新
Customer customer = session.get(Customer.class, 3L);
LinkMan linkMan = session.get(LinkMan.class, 5l); //关联
customer.getLinkMans().add(linkMan);
linkMan.setCustomer(customer);
session.update(customer);
tx.commit();
}
hibernate_04_hibernate多对多的关系映射的更多相关文章
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作
- sql联合主键,用于多对多,关系映射
如题.记录下. 复合主键,由多个字段共同确定一行信息 composite key, containing multi cols to fix one element.
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- 详谈Hibernate框架关系映射!
接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!! 你还可以保存一个对象, ...
- Hibernate执行流程和关系映射
一.Hibernate的执行流程 hibernate作为一个ORM框架,它封装了大量数据库底层的sql语句操作的方法,这样在执行hibernate的过程中理解hibernate的执行流程很有必要. 由 ...
- Hibernate一对多、多对一的关系表达
一.关系表达: 1.一对多.多对一表的关系: 学生表: 班级表: 在学生表中,学生的学号是主键.在班级表中,班级号是主键,因此,学生表的外键是classno.因此,班级对应学生是一对多,学生对应班级是 ...
- 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】
一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...
- Hibernate框架之双向多对多关系映射
昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...
随机推荐
- 小白如何在Windows下使用Redis
一.redis下载按装 Nuget 可以直接下载 redis 将下来的包拷贝到自已需要的目录如我放到桌面文件夹“近期需要\Redis应用\redis-64.3.0.503” 操作 cmd进入命令操作 ...
- centos7 安装KDE
下载安装了centos7 64位系统之后.初始化安装的是GNOME桌面系统.因为是按照鸟哥的Linux在学习,所以需要安装kde. 首先需要root权限. 打开终端. 输入su root密码.进入ro ...
- GYM 101933E 状态压缩 + 记忆化搜索
题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大? 思路:因为n和m的范围很小,我们可 ...
- java中Class.getMethods()和Class.getDeclaredMethods()的区别
在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等.由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了get ...
- [转载]python异常如何全面捕获
写在前面:最近写python程序,进场遇到异常的问题,因此需要捕获异常.查阅了下资料,整理如下: 常见的异常处理的方法: 假设有下面的一段程序: try: 语句1 语句2 . ...
- linux下设置Git
目录 ## Git介绍 1.工作原理 2.SVN与Git的最主要的区别? 3.操作 4.创建本地仓库 5.把文件添加到本地仓库 6.版本回退 7.理解工作区(workspace)与暂存区(index) ...
- leetcood学习笔记-118-杨辉三角
题目描述: 第一次提交: class Solution: def generate(self, numRows: int): l = [] for i in range(numRows): n = [ ...
- leetcood学习笔记-235-二叉搜索树的最近公共祖先
题目描述: 利用二叉搜索树的特点,如果p.q的值都小于root,说明p q 肯定在root的左子树中:如果p q都大于root,说明肯定在root的右子树中,如果一个在左一个在右 则说明此时的root ...
- 使用idea开发分布式项目中优化tomact的方法
1. idea内存优化 找到idea安装目录,我的是在D:\IDEA\bin目录中 找到idea.exe.vmoptions和idea64.exe.vmoptions文件 这两个文件全部改成如下配置, ...
- (转)Linux负载均衡软件LVS之一(概念篇)
转:http://ixdba.blog.51cto.com/2895551/552947 Linux负载均衡软件LVS之二(安装篇):http://ixdba.blog.51cto.com/28955 ...