hibernate多表操作
一、表之间的关系
1.一对一
2.一对多
3.多对多
二、表之间关系建表原则
1.一对多:在多的一方创建一个外键,指向一的一方的主键

2.多对多:创建一个中间表,中间表至少有两个字段,分别作为外键指向多对多双方的主键

3.一对一:主键一一对应,或当成一对多来看待。
三、一对多实现
1)定义
1.在1的domain类中定义:
private Set<link> links= new HashSet<>();
在相应映射配置文件中:
<!--一对多-->
<set name="links"><!--set属性名称-->
<key column="link_cust_id"></key><!--外键-->
<one-to-many class="com.ual.domain.link"></one-to-many>
</set>
如果想要保存记录的时候保存其级联的记录,需要在set 后添加
cascade="save-update"
2.在多的domain类中定义:
//一个联系人只对应一个客户
private customer customer;
在相应映射配置文件中:
<many-to-one name="customer" class="com.ual.domain.customer" column="link_cust_id" insert="false" update="false" lazy="false"></many-to-one>
加入lazy="false"后,在查询时会把记录相关的外键对应的记录一起查询出来。
3.在核心配置文件中,把映射关系写入
<mapping resource="com/ual/domain/customer.hbm.xml"/><!--告诉hibernate要操作哪些表,写入映射的配置文件的全路径-->
<mapping resource="com/ual/domain/link.hbm.xml"></mapping>
4.实现插入
@Test
public void test(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
customer c1 = new customer();
c1.setCust_name("c1");
customer c2= new customer();
c2.setCust_name("c2");
link link1 = new link();
link1.setLink_name("link1");
link link2 = new link();
link2.setLink_name("link2");
link link3 = new link();
link3.setLink_name("link3");
/*配置关系*/
c1.getLinks().add(link1);
c1.getLinks().add(link3);
c2.getLinks().add(link2);
link1.setCustomer(c1);
link2.setCustomer(c2);
link3.setCustomer(c1);
/*保存联系人*/
session.save(c1);
session.save(c2);
session.save(link1);
session.save(link2);
session.save(link3); transaction.commit();
}
配置关系时,一般使用双向维护
2)查询
@Test
public void test2(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
link link=session.get(com.ual.domain.link.class,6L);
transaction.commit();
System.out.println(link.getLink_name());
System.out.println(link.getCustomer().getCust_name());
}
注:
级联操作:
1.问题:在两张表建立一对多关系时,如果只保存一边的对象,会引发异常
2.级联操作:
什么时级联操作:在操作一个对象时,是否会操作其关联的对象
级联分类:
级联保存或更新:cascade="save-update"
级联删除:cascade="delete,save-update"
级联是有方向性的:保存的是谁就到谁里面做级联,删除的是谁就到谁里面做级联
3)更新
@Test
public void test4(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
//更新
link link=session.get(link.class,10L);
customer customer=session.get(com.ual.domain.customer.class,13L);
//10本来关联12,现让其关联13
//双向维护
customer.getLinks().add(link);
link.setCustomer(customer);
session.update(customer);
transaction.commit();
}
注: 由于使用的双向维护,两方同时去维护一个外键,会产生性能问题,可以让一方放弃维护外键,只让外键所在的表维护外键
需要配置:在1的配置文件中:加inverse="true"
四、多对多关系实现
1、表关系:用户角色表

2、多对多映射文件配置
role:
<?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">
<!--让java中的类与数据库中的表相关联,这样操作domain类就操作了与该类映射的表-->
<hibernate-mapping>
<class name="com.ual.domain.role" table="role"><!--name对应类中,table对应表中-->
<!--建立类属性,哪一个是主键,该主键需要跟数据库中的主键相对应-->
<id name="r_id" column="r_id"><!--name对应类,column对应表-->
<generator class="native"/><!--主键生成策略-->
</id>
<!--建立类中的普通属性和数据库中的字段进行关联-->
<property name="r_name" column="r_name"/>
<!--多对多-->
<set name="users" table="role_user">
<key column="r_id"></key>
<many-to-many class="com.ual.domain.user" column="u_id"></many-to-many>
</set>
</class> </hibernate-mapping>
user:
<?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">
<!--让java中的类与数据库中的表相关联,这样操作domain类就操作了与该类映射的表-->
<hibernate-mapping>
<class name="com.ual.domain.user" table="user"><!--name对应类中,table对应表中-->
<!--建立类属性,哪一个是主键,该主键需要跟数据库中的主键相对应-->
<id name="u_id" column="u_id"><!--name对应类,column对应表-->
<generator class="native"/><!--主键生成策略-->
</id>
<!--建立类中的普通属性和数据库中的字段进行关联-->
<property name="u_name" column="u_name"/>
<!--多对多
name: 当前类下集合属性的名称
table:多对多中间表的表名
column:当前表的外键
<many-to-many class="" column=""></many-to-many>
class:当前类集合中对象的全路径
column:集合中对象的外键
-->
<set name="roles" table="role_user">
<key column="u_id"></key>
<many-to-many class="com.ual.domain.role" column="r_id"></many-to-many>
</set>
</class> </hibernate-mapping>
3、配置核心配置文件
<mapping resource="com/ual/domain/role.hbm.xml"></mapping>
<mapping resource="com/ual/domain/user.hbm.xml"></mapping>
4、插入数据测试
@Test
public void test(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
//创建用户
user user1 = new user();
user1.setU_name("user1");
user user2 = new user();
user2.setU_name("user2");
//创建角色
role role1 = new role();
role1.setR_name("role1");
role role2 = new role();
role role3 = new role();
role2.setR_name("role2");
role3.setR_name("role3"); //配置关系
user1.getRoles().add(role1);
user1.getRoles().add(role2);
user2.getRoles().add(role1);
user2.getRoles().add(role3); role1.getUsers().add(user1);
role1.getUsers().add(user2);
role2.getUsers().add(user1);
role3.getUsers().add(user2);
//保存
session.save(user1);
session.save(user2); transaction.commit();
}
注意:在多对多建表时,使用双向维护,必须要使得一方放弃外键维护权,一般在被选择一方放弃外键维护,如角色被用户选择,让角色放弃外键维护权。否则,报外键重复异常。
<set name="users" table="role_user" inverse="true" >
<key column="r_id"></key>
<many-to-many class="com.ual.domain.user" column="u_id" ></many-to-many>
</set>
5、其他数据操作
@Test
public void test2(){
//关系操作 就是操作内部集合
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
//给用户1添加角色3
user user = session.get(user.class, 1L);
role role = session.get(role.class, 3L);
user.getRoles().add(role);
transaction.commit();
}
@Test
public void test3(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
//更改,把用户2的角色3 修改为2
user user2 = session.get(user.class, 2L);
role role3 = session.get(role.class, 3L);
role role2 = session.get(role.class, 2L);
user2.getRoles().remove(role3);
user2.getRoles().add(role2);
transaction.commit();
}
hibernate多表操作的更多相关文章
- Hibernate单表操作
单一主键 assigned:由Java应用程序负责生成(即手工的赋值) native:由底层的数据库自动的生成标示符,如果是MySQL就是auto_increment,如果是Oracle就是seque ...
- (三)hibernate单表操作
0. 贴上节hbm文件 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hib ...
- hibernate课程 初探单表映射3-1 hibernate单表操作简介
本章简介: 1 单一主键 2 基本类型 3 对象类型 4 组件属性 5 单表操作CRUD实例
- 六 Hibernate多表操作&级联&外键维护
Hibernate的一对多关联映射 Hibernate的多对多关联映射 数据库表与表之间的关系:一对多,多对多,一对一 一对多:一个部门对应多个员工,一个员工只能属于一个部门.一个客户对应多个联系人, ...
- 2.1、Hibernate多表操作--一对多、多对一、多对多。
一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...
- Hibernate单表操作(一)——单一主键
assigned由java应用程序负责生成.(手工赋值) native由底层数据库自己主动生成标识符,假设是MySQL就是increment,假设是oracle就是sequence.等等.
- Hibernate原理、配置及单表操作
一.Hibernate的配置文档 其中:hbm2ddl.auto中的create表示每次修改数据的时候都会删除原有的表,生成新的表结构,原有的数据不再存在:update表示在原有数据的基础上进行更新, ...
- Hibernate多表查询连接操作
SQL多表操作分类; 1.交叉连接:select*from t_customer cross Join t_order; 2.显示内连接: select*from t_customer c inner ...
- hibernate学习笔记(6)组件属性以及单表操作
组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...
随机推荐
- redis设置密码以及jedisPool设置密码
转: redis设置密码以及jedisPool设置密码 2019年01月02日 20:24:43 宇文荒雪 阅读数:1118 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- js中同一个onclick绑定了两个js方法出现的问题
问题: js中如果同一个onclick绑定了两个js方法问题,即 <li onclick="f1(),f2()"></li> 两个方法f1,f2中都分别有一 ...
- 2、编程工具IAR、烧写工具SmartRF的使用
IAR可以生成hex文件,SmartRF烧写hex文件到CC2530单片机. [IAR] 主要步骤:创建workspace.新建工程Project.新建文件(C源件).C源件Add到Proje ...
- 【清北学堂2018-刷题冲刺】Contest 7
Task 1:小奇采药 [问题描述] 小奇是只天资聪颖的喵,他的梦想是成为世界上最伟⼤的医师. 为此,他想拜喵星球最有威望的医师为师. 医师为了判断他的资质,给他出了⼀个难题. 医师把他带到⼀ ...
- (点到线段的最短距离)51nod1298 圆与三角形
1298 圆与三角形 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). 收起 ...
- 干货分享:互联网运营 学习SEO从零开始 SEO深度解析学习笔记
最近在自学SEO,互联网运营,把做的笔记干货分享给大家啊! 希望能帮到大家,如有好的建议可以关注我[磨人的小妖精]或留言,大家一起探讨. 之前还写过一篇文章互联网运营+SEO:推荐必看的5本书籍,学习 ...
- bzoj2733 离线+并查集+主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2733 网上清一色的合并线段树题解,我又不会,只能自己胡来,没想到Rush过去了 永无乡包含 n 座 ...
- Shiro中session超时页面跳转的处理
问题描述 shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时. 本文从这两个方面分别考虑并处理. ajax请 ...
- Spring Boot笔记五: Web开发之Webjar和静态资源映射规则
目录 Webjar /** 访问当前项目的任何资源 欢迎页 标签页图标 Webjar 开始讲到Spring Boot的Web开发了,先介绍Webjar,这个其实就是把一些前端资源以jar包的形式导入到 ...
- vue实现筛选功能,文字选中变色
<template> <Poptip trigger="hover" title="Title" content="content& ...