一.一对多操作

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. assert.strictEqual()

    assert.strictEqual(actual, expected[, message]) 使用全等运算符(===)测试 actual 参数与 expected 参数是否全等. // 格式 ass ...

  2. 13、Actor

    1.介绍 Scala的Actor类似于Java中的多线程编程.但是不同的是,Scala的Actor提供的模型与多线程有所不同. Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现 ...

  3. 通俗地讲,Netty 能做什么?

    https://www.zhihu.com/question/24322387/answer/78947405 作者:郭无心链接:https://www.zhihu.com/question/2432 ...

  4. 阶段3-团队合作\项目-网络安全传输系统\sprint1-传输子系统设计\第3课-加密传输优化

    对之前的传输系统进行加密,使之成为加密的网络传输系统 客户端编程模型 通过以上模型对传统的TCP传输模型进行优化 首先完成初始化工作,它是要在创建socket之前完成 主要是以上四个函数的实现,那么这 ...

  5. 阶段2-新手上路\项目-移动物体监控系统\Sprint4-嵌入式web服务器开发\第3课-CGI程序开发

    实现CGI程序显示一幅图片最核心的功能 把上一节课编写好的led.c程序拷贝过来,并重新命名为image.c 把led的某些部分删除,后如下 那么如何显示一幅图片呢,百度(搜索在html里面去插入图片 ...

  6. 使用Cors后台设置WebAPI接口跨域访问

    昨天根据项目组前端开发工程师反映,在浏览器端无法直接使用ajax访问后台接口获取数据,根据他的反映,我查阅了相关跨域的解决方案: 一:使用jsonP,但是jsonP只能使用GET请求,完全不符合我项目 ...

  7. Jquery常用标签

    $(this).hide(1000)//隐藏该元素 $(this).show(1000)//显示该元素 $(this).fadeIn(1000)//淡入已隐藏的元素 $(this).fadeOut(1 ...

  8. Unable to round-trip http request to upstream: EOF问题

    Unable to round-trip http request to upstream: EOF, 今天我用的phpstudy环境中的网站页面忽然打不开了,报错“Unable to round-t ...

  9. $each 遍历json字符串

    $.each遍历json对象   查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. var json = [ {"id":"1",&qu ...

  10. python之Selenium库的使用

    一  什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并 ...