一.一对多操作

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. spring 4.0 注解数据验证1

    通常情况下,数据验证都分为前台验证,后台验证.并且前台JS验证是肯定有的,那么其实验证的错误信息根本不必通过后台传过去,哪怕就是想国际化,前台JS也能够胜任. 如果前台验证足够了,那么如果还有不正确的 ...

  2. 树莓派 Learning 002 装机后的必要操作 --- 00 修改键盘布局

    树莓派 装机后的必要操作 - 修改键盘布局 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 上网查,发现树莓派的键盘布局不对,树莓派(ras ...

  3. 16、GATK使用简介 Part1/2

    转载:http://blog.sina.com.cn/s/blog_6721167201018fyw.html GATK (全称The Genome Analysis Toolkit)是Broad I ...

  4. HDU 5236 Article (概率DP+贪心)

    题意:要求输入一篇N个字符的文章,对所有非负整数i:每到第i+0.1秒时可以输入一个文章字符,每到第i+0.9秒时有P的概率崩溃(回到开头或者上一个存盘点) 每到第i秒有一次机会可以选择按下X个键存盘 ...

  5. hdu1077

    #include<iostream> #include<cmath> using namespace std; struct Point { double x,y; }; do ...

  6. 51nod1007(01背包)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007 题意:中文题诶- 思路:尽量将一个数组分成两个相等的部 ...

  7. 洛谷P2060 faebdc玩扑克2

    P2060 faebdc玩扑克2 题目背景 faebdc和zky又在玩扑克 题目描述 给你2N张牌,编号为1,2,3..n,n+1,..2n.这也是最初的牌的顺序. 一次洗牌是把序列变为n+1,1,n ...

  8. Fiddler-抓Android和IOS包

    知识:Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. 等等苹果的设备.  同理,也可以截获Andriod,Windows Phone的等设备发出的HTTP/ ...

  9. [题解](排列/逆序对)luogu_P1338末日的传说

    首先我们要考虑怎么排能使逆序对数最多:显然是下降序列时,会产生n*(n-1)/2数量的逆序对 那么我们肯定是要尽量把序列的尾端安排成下降序列,前面的尽量不动,中间可能有一段排列自适应到m的逆序对数 然 ...

  10. git 处理 crlf rf

    假如你正在 Windows 上写程序,又或者你正在和其他人合作,他们在 Windows 上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题.这是因为 Windows 使用回车和换行两 ...