一.一对多操作

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--多表操作-导航查询的更多相关文章

  1. (转)Hibernate中的多表操作

    http://blog.csdn.net/yerenyuan_pku/article/details/70556208 Hibernate中的多表操作 在实际开发中,我们不可能只是简简单单地去操作单表 ...

  2. day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询

    目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...

  3. Hibernate学习笔记--------1.单表操作

    一.hibernate基本开发步骤 1.引入包,官网下载的包,目录\lib\required下的jar都加进去,这里使用的是 hibernate-release-5.2.1.Final 2.编写配置文 ...

  4. Hibernate超简单多表操作

    所谓一对多映射 在数据库中我们通常会通过添加外键的方式将表关联起来,表现一对多的关系. 而在Hibernate中,我们则要通过在一方持有多方的集合来实现,即在"一"的一端中使用元素 ...

  5. (十五)Hibernate中的多表操作(5):双向多对多

    Hibernate的双向关联. 对象之间可以相互读取.        双向只针对读取的操作.对于增.删除.改的操作没有任何影响. 案例 : 实现双向多对多 MenuBean.java package ...

  6. (十一)Hibernate中的多表操作(1):单向一对多

    一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...

  7. (十二)Hibernate中的多表操作(2):单向多对一

    由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...

  8. Oracle 数据库基本操作——表操作:查询

    目录: 1.基本查询 2.多表查询 3.多行查询 4.集合查询 2.连接 3.嵌套查询 1.基本查询 语法: select column|others{,columnName|others} from ...

  9. Hibernate 系列教程3-单表操作

    工程截图 hibernate.cfg.xml <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Conf ...

随机推荐

  1. 泛型中new()约束的用法

    一..NET中支持的类型参数约束有以下几种 where T : struct              T必须是一个结构类型where T : class               T必须是一个类( ...

  2. 【转】‘svn’不是内部或外部命令,也不是可运行的程序

    解决方法:windows安装svn的时候默认是不安装 svn command line这个东西的,重新打开svn的安装exe,选择modify,将“command line client tools” ...

  3. hdu1065

    #include <stdio.h> int main() { int t; double x, y; scanf("%d", &t); for; i < ...

  4. BootStrap2学习日记23---弹出对话框

    <a href="#login" data-toggle="modal" class="btn btn-primary">登陆& ...

  5. vue + eCharts 实现图表展示

    一.首先安装 eCharts 依赖 npm install echarts -S 二.main.js 引入 eCharts 依赖 2.1)在 main.js 中引入 import echarts fr ...

  6. Openstack swift 学习笔记

    Swift 不是文件系统或者实时的数据存储系统,而是对象存储,用于长期存储永久类型的静态数据.这些数据可以检索.调整和必要时进行更新.Swift最适合虚拟机镜像.图片.邮件和存档备份这类数据的存储. ...

  7. 洛谷P1023 税收与补贴问题

    P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...

  8. [Xcode 实际操作]五、使用表格-(6)UITableView滑动到指定单元格

    目录:[Swift]Xcode实际操作 本文将演示如何使表格滑动到指定的索引路径. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首 ...

  9. Windows 在目录中搜索哪个文件中有指定字符串

    findstr /s /i "string" *.* 表示,当前目录以及子目录下的所有文件中查找"string"这个字符串. *.*表示所有类型的文件. /s ...

  10. 洛谷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 ...