Hibernate笔记3--多表操作-导航查询
一.一对多操作
1.构造实体类及编写配置文件:
一方:
1 // 一个Customer对应多个linkman
2 private Set<Linkman> linkmans = new HashSet<>(0);
配置:
1 <!-- inverse="true"代表放弃外键维护权 -->
2 <set name="linkmans" inverse="true">
3 <!-- 配置从表的外键名 -->
4 <key column="sys_cust_id"></key>
5 <!-- 配置关联方式 -->
6 <one-to-many class="entity.Linkman"/>
7 </set>
多方:
1 // 多个linkman对应一个customer
2 private Customer customer;
配置:
1 <!-- 配置关联关系 -->
2 <many-to-one name="customer" class="entity.Customer" column="sys_cust_id"></many-to-one>
2.测试代码
1 package demo;
2
3 import org.hibernate.Session;
4 import org.hibernate.Transaction;
5 import org.junit.Test;
6
7 import entity.Customer;
8 import entity.Linkman;
9 import utils.HibernateUtils;
10
11 //一对多操作
12 public class demo01 {
13 @Test
14 public void test() {
15 Session cs = HibernateUtils.getCurrentSession();
16 Transaction tx = cs.beginTransaction();
17 // 创建一个客户
18 Customer cust = new Customer();
19 cust.setCustName("A公司");
20 // 创建与客户关联的联系人
21 Linkman man = new Linkman();
22 man.setLkmName("Jack");
23 // 保存关系--配置一的一方的set标签的inverse属性的值为true,放弃外键维护权
24 cust.getLinkmans().add(man);
25 man.setCustomer(cust);
26 // 保存
27 cs.save(cust);
28 cs.save(man);
29 // 提交
30 tx.commit();
31 }
32 }
33
二.多对多操作
1.构造实体类及编写配置文件:
多方1-User:
1 <!-- 配置关联关系 多对多,table代表中间表,cascade表示允许级联操作:all/save-update/delete-->
2 <set name="roles" table="sys_user_role" cascade="all">
3 <!--外键:当前对象在中间表的外键名 -->
4 <key column="sys_user_id"></key>
5 <!--对方的全限定名,及在中间表的外键名 -->
6 <many-to-many class="entity.Role" column="sys_role_id"></many-to-many>
7 </set>
多方2-Role:
1 <!-- 配置关联关系 多对多-->
2 <set name="users" table="sys_user_role" inverse="true">
3 <!--外键:当前对象在中间表的外键名 -->
4 <key column="sys_role_id"></key>
5 <!--对方的全限定名,及在中间表的外键名 -->
6 <many-to-many class="entity.User" column="sys_user_id"></many-to-many>
7 </set>
2.测试代码:
1 package demo;
2
3 import org.hibernate.Session;
4 import org.hibernate.Transaction;
5 import org.junit.Test;
6
7 import entity.Role;
8 import entity.User;
9 import utils.HibernateUtils;
10
11 //测试多对多操作
12 public class demo02 {
13 @Test
14 public void testAdd() {
15 Session cs = HibernateUtils.getCurrentSession();
16 Transaction tx = cs.beginTransaction();
17 // 创建一个user
18 User u = new User();
19 u.setUserName("Rose");
20 // 创建一个role
21 Role r = new Role();
22 r.setRoleName("painter");
23 // 维护中间表,配置文件中被动一方放弃维护权
24 u.getRoles().add(r);
25 r.getUsers().add(u);
26 // 保存
27 cs.save(u);
28 cs.save(r);
29 tx.commit();
30 }
31
32
33 @Test
34 // 多对多级联操作,多一个配置,少一个保存
35 public void testCascade() {
36 Session cs = HibernateUtils.getCurrentSession();
37 Transaction tx = cs.beginTransaction();
38 // 创建一个user
39 User user = new User();
40 user.setUserName("Jack");
41 // 创建一个role
42 Role role = new Role();
43 role.setRoleName("model");
44 // 维护中间表,被动一方配置为放弃维护权
45 user.getRoles().add(role);
46 role.getUsers().add(user);
47 // 保存user,user配置级联操作,即user可以操作role
48 cs.save(user);
49 // 下一行语句不报错,只是维护了cst_role表格,因为role没有配置级联操作
50 // cs.save(role);
51 // 提交事务
52 tx.commit();
53 }
54
55 @Test
56 // 给1号用户添加2号角色操作
57 public void addRole() {
58 Session cs = HibernateUtils.getCurrentSession();
59 Transaction tx = cs.beginTransaction();
60 // 获取1号用户
61 User user01 = cs.get(User.class, 1L);
62 // 获取2号角色
63 Role role02 = cs.get(Role.class, 2L);
64 // 分配角色
65 user01.getRoles().add(role02);
66 // 保存
67 cs.save(user01);
68 // 提交
69 tx.commit();
70 }
71
72 @Test
73 // 删除1号用户的1号角色
74 public void delRole() {
75 Session cs = HibernateUtils.getCurrentSession();
76 Transaction tx = cs.beginTransaction();
77 // 获取1号用户
78 User user01 = cs.get(User.class, 1L);
79 // 获取1号角色
80 Role role01 = cs.get(Role.class, 1L);
81 // 删除1号用户的1号角色
82 user01.getRoles().remove(role01);
83 // 保存
84 cs.save(user01);
85 // 提交事务
86 tx.commit();
87 }
88
89 @Test
90 // 修改1号用户为3号角色
91 public void changeRole() {
92 Session cs = HibernateUtils.getCurrentSession();
93 Transaction tx = cs.beginTransaction();
94 // 获取1号用户
95 User user01 = cs.get(User.class, 1L);
96 // 获取2号角色
97 Role role02 = cs.get(Role.class, 2L);
98 // 获取3号角色
99 Role role03 = cs.get(Role.class, 3L);
100 // 删除1号用户的2号角色
101 user01.getRoles().remove(role02);
102 // 添加3号角色
103 user01.getRoles().add(role03);
104 // 保存
105 cs.save(user01);
106 // 提交事务
107 tx.commit();
108 }
109 }
110
三.导航查询
概念:比如客户与联系人是一对多的关系,通过查询客户也能查询其对应的联系人,则称为导航查询.导航查询默认为延迟加载;如果使延迟加载失效,则在客户的映射关系文件的set标签内配置lazy属性
<!-- lazy : 配置查询关联对象的延迟加载
true:使用延迟,默认
false:不使用延迟
extra:极其懒惰-->
Hibernate笔记3--多表操作-导航查询的更多相关文章
- (转)Hibernate中的多表操作
http://blog.csdn.net/yerenyuan_pku/article/details/70556208 Hibernate中的多表操作 在实际开发中,我们不可能只是简简单单地去操作单表 ...
- day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...
- Hibernate学习笔记--------1.单表操作
一.hibernate基本开发步骤 1.引入包,官网下载的包,目录\lib\required下的jar都加进去,这里使用的是 hibernate-release-5.2.1.Final 2.编写配置文 ...
- Hibernate超简单多表操作
所谓一对多映射 在数据库中我们通常会通过添加外键的方式将表关联起来,表现一对多的关系. 而在Hibernate中,我们则要通过在一方持有多方的集合来实现,即在"一"的一端中使用元素 ...
- (十五)Hibernate中的多表操作(5):双向多对多
Hibernate的双向关联. 对象之间可以相互读取. 双向只针对读取的操作.对于增.删除.改的操作没有任何影响. 案例 : 实现双向多对多 MenuBean.java package ...
- (十一)Hibernate中的多表操作(1):单向一对多
一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...
- (十二)Hibernate中的多表操作(2):单向多对一
由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...
- Oracle 数据库基本操作——表操作:查询
目录: 1.基本查询 2.多表查询 3.多行查询 4.集合查询 2.连接 3.嵌套查询 1.基本查询 语法: select column|others{,columnName|others} from ...
- Hibernate 系列教程3-单表操作
工程截图 hibernate.cfg.xml <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Conf ...
随机推荐
- 泛型中new()约束的用法
一..NET中支持的类型参数约束有以下几种 where T : struct T必须是一个结构类型where T : class T必须是一个类( ...
- 【转】‘svn’不是内部或外部命令,也不是可运行的程序
解决方法:windows安装svn的时候默认是不安装 svn command line这个东西的,重新打开svn的安装exe,选择modify,将“command line client tools” ...
- hdu1065
#include <stdio.h> int main() { int t; double x, y; scanf("%d", &t); for; i < ...
- BootStrap2学习日记23---弹出对话框
<a href="#login" data-toggle="modal" class="btn btn-primary">登陆& ...
- vue + eCharts 实现图表展示
一.首先安装 eCharts 依赖 npm install echarts -S 二.main.js 引入 eCharts 依赖 2.1)在 main.js 中引入 import echarts fr ...
- Openstack swift 学习笔记
Swift 不是文件系统或者实时的数据存储系统,而是对象存储,用于长期存储永久类型的静态数据.这些数据可以检索.调整和必要时进行更新.Swift最适合虚拟机镜像.图片.邮件和存档备份这类数据的存储. ...
- 洛谷P1023 税收与补贴问题
P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...
- [Xcode 实际操作]五、使用表格-(6)UITableView滑动到指定单元格
目录:[Swift]Xcode实际操作 本文将演示如何使表格滑动到指定的索引路径. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首 ...
- Windows 在目录中搜索哪个文件中有指定字符串
findstr /s /i "string" *.* 表示,当前目录以及子目录下的所有文件中查找"string"这个字符串. *.*表示所有类型的文件. /s ...
- 洛谷P2486 [SDOI2011]染色
题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...