一.一对多操作

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. nodejs中 underscore 包有什么作用

    Underscore一个JavaScript实用库,提供了一整套函数式变成有用的实用功能,但是没有扩展任何JavaScript内置对象.它是这个问题的答案:“如果我在一个空白的HTML页面前坐下, 并 ...

  2. c# 创建缩略图

    /// <summary> /// 创建缩略图 /// </summary> /// <param name="srcFileName">< ...

  3. JSK 糟糕的bug

    传送门 题目居然复制不了(QAQ) 分析 TrieJSK已经2比较详细了,就不再单独写博客了,此题相较于Trie模板有一点不同,此题要求比较前缀却没有规定前面是后面的前缀还是后面是前面的前缀,所以我们 ...

  4. iperf3

    1.安装 将下载得到的“iperf-3.1.3-win64.zip”文件解压缩,得到“iperf3.exe”和“cygwin1.dll”两个文件.将这两个文件复制到“%systemroot%”(大多数 ...

  5. 阶段3-团队合作\项目-网络安全传输系统\sprint3-账号管理子系统设计\第2课-账号管理子系统设计

    账号管理子系统的设计 客户端需要登录到服务器,在服务器去查询数据库,进行验证该用户. 打开client.c文件 编译之 把它复制到开发板里面去 这个程序是在本地数据库测试的!!!!!!!!!!!!!! ...

  6. Win7常用但是被忽略的快捷键

    General keyboard shortcuts 1.Ctrl + Right Arrow Move the cursor to the beginning of the next word  向 ...

  7. vue使用webpack压缩后体积过大要怎么优化

    vue使用webPack压缩后存储过大,怎么优化 在生产环境去除developtool选项 在webpack.config.js中设置的developtool选项,仅适用于开发环境,这样会造成打包成的 ...

  8. IE浏览器不支持Promise对象

    1. 安装babel-polyfill插件转换 npm install --save-dev babel-polyfill 2. 在webpack中引入babel-polyfill 在webpack. ...

  9. BUYING FEED

    Problem F: F BUYING FEED Description Farmer John needs to travel to town to pick up K (1 <= K < ...

  10. vue中点击空白处隐藏弹框(用指令优雅地实现)

    在写vue的项目的时候,弹框经常性出现,并要求点击弹框外面,关闭弹框,那么如何实现呢?且听我一一...不了,能实现效果就好 <template> <div> <div c ...