一、今天内容

0 列表功能实现

1 表与表之间关系回顾

(1)一对多(客户和联系人)

(2)多对多(用户和角色)

2 hibernate一对多操作

(1)一对多映射配置

(2)一对多级联保存

(3)一对多级联删除

(4)inverse属性

3 hibernate多对多操作

(1)多对多映射配置

(2)多对多级联保存(重点)

(3)多对多级联删除

(4)维护第三张表

二、客户列表功能

1 sessionFactory已经关闭了,不需要关闭

2 dao里面代码

//使用hibernate实现查询列表
public List<Customer> findAll() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
//得到sessionFactory
sessionFactory = HibernateUtils.getSessionFactory();
//得到session
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction(); //查询所有记录
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list(); //提交事务
tx.commit();
return list;
}catch(Exception e) {
tx.rollback();
}finally {
session.close();
//sessionFactory不需要关闭
// sessionFactory.close();
}
return null;
}

三、表与表之间关系回顾(重点)

1 一对多

(1)分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类

(2)客户和联系人是一对多关系

- 客户:与公司有业务往来,百度、新浪、360

- 联系人:公司里面的员工,百度里面有很多员工,联系员工

** 公司和公司员工的关系

- 客户是一,联系人是多

- 一个客户里面有多个联系人,一个联系人只能属于一个客户

(3)一对多建表:通过外键建立关系

2 多对多

(1)订单和商品关系,一个订单里面有多个商品,一个商品属于多个订单

(2)用户和角色多对多关系

- 用户: 小王、小马、小宋

- 角色:总经理、秘书、司机、保安

** 比如小王 可以 是总经理,可以是司机

** 比如小宋 可以是司机,可以是秘书,可以保安

** 比如小马 可以是 秘书,可以是总经理

-          一个用户里面可以有多个角色,一个角色里面可以有多个用户

(3)多对多建表:创建第三张表维护关系

3 一对一

(1)在中国,一个男人只能有一个妻子,一个女人只能有一个丈夫

四、Hibernate的一对多操作(重点)

1.一对多映射配置(重点)

以客户和联系人为例:客户是一,联系人是多

第一步 创建两个实体类,客户和联系人

第二步 让两个实体类之间互相表示

(1)在客户实体类里面表示多个联系人

- 一个客户里面有多个联系人

(2)在联系人实体类里面表示所属客户

- 一个联系人只能属于一个客户

第三步 配置映射关系

(1)一般一个实体类对应一个映射文件

(2)把映射最基本配置完成

(3)在映射文件中,配置一对多关系

- 在客户映射文件中,表示所有联系人

- 在联系人映射文件中,表示所属客户

第四步 创建核心配置文件,把映射文件引入到核心配置文件中

测试:

2.一对多级联操作

级联操作

1 级联保存

(1)添加一个客户,为这个客户添加多个联系人

2 级联删除

(1)删除某一个客户,这个客户里面的所有的联系人也删除

3.一对多级联保存

1 添加客户,为这个客户添加一个联系人

(1)复杂写法:

//演示一对多级联保存
@Test
public void testAddDemo1() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
//得到sessionFactory
sessionFactory = HibernateUtils.getSessionFactory();
//得到session
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction(); // 添加一个客户,为这个客户添加一个联系人
//1 创建客户和联系人对象
Customer customer = new Customer();
customer.setCustName("传智播客");
customer.setCustLevel("vip");
customer.setCustSource("网络");
customer.setCustPhone("110");
customer.setCustMobile("999"); LinkMan linkman = new LinkMan();
linkman.setLkm_name("lucy");
linkman.setLkm_gender("男");
linkman.setLkm_phone("911"); //2 在客户表示所有联系人,在联系人表示客户
// 建立客户对象和联系人对象关系
//2.1 把联系人对象 放到客户对象的set集合里面
customer.getSetLinkMan().add(linkman);
//2.2 把客户对象放到联系人里面
linkman.setCustomer(customer); //3 保存到数据库
session.save(customer);
session.save(linkman); //提交事务
tx.commit(); }catch(Exception e) {
tx.rollback();
}finally {
session.close();
//sessionFactory不需要关闭
sessionFactory.close();
}
}

(2)简化写法

- 一般根据客户添加联系人

第一步 在客户映射文件中进行配置

- 在客户映射文件里面set标签进行配置

第二步 创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了

//演示一对多级联保存
@Test
public void testAddDemo2() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
//得到sessionFactory
sessionFactory = HibernateUtils.getSessionFactory();
//得到session
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction();
// 添加一个客户,为这个客户添加一个联系人
//1 创建客户和联系人对象
Customer customer = new Customer();
customer.setCustName("百度");
customer.setCustLevel("普通客户");
customer.setCustSource("网络");
customer.setCustPhone("110");
customer.setCustMobile("999"); LinkMan linkman = new LinkMan();
linkman.setLkm_name("小宏");
linkman.setLkm_gender("男");
linkman.setLkm_phone("911");
//2 把联系人放到客户里面
customer.getSetLinkMan().add(linkman);
//3 保存客户
session.save(customer); //提交事务
tx.commit();
}catch(Exception e) {
tx.rollback();
}finally {
session.close();
//sessionFactory不需要关闭
sessionFactory.close();
}
}

4.一对多级联删除

1 删除某个客户,把客户里面所有的联系人删除

2 具体实现

第一步 在客户映射文件set标签,进行配置

(1)使用属性cascade属性值 delete

第二步 在代码中直接删除客户

(1)根据id查询对象,调用session里面delete方法删除

3 执行过程:

(1)根据id查询客户

(2)根据外键id值查询联系人

(3)把联系人外键设置为null

(4)删除联系人和客户

5.一对多修改操作(inverse属性)

1 让lucy联系人所属客户不是传智播客,而是百度

2 inverse属性

(1)因为hibernate双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人时候也修改一次外键,造成效率问题

(2)解决方式:让其中的一方不维护外键

- 一对多里面,让其中一方放弃外键维护

- 一个国家有总统,国家有很多人,总统不能认识国家所有人,国家所有人可以认识总统

 

(3)具体实现:

在放弃关系维护映射文件中,进行配置,在set标签上使用inverse属性

五、Hibernate多对多操作

1.多对多映射配置

以用户和角色为例演示

第一步 创建实体类,用户和角色

第二步 让两个实体类之间互相表示

(1)一个用户里面表示所有角色,使用set集合

(2)一个角色有多个用户,使用set集合

第三步 配置映射关系

(1)基本配置

(2)配置多对多关系

- 在用户里面表示所有角色,使用set标签

在角色里面表示所有用户,使用set标签

第四步 在核心配置文件中引入映射文件

测试:

2.多对多级联保存

根据用户保存角色

第一步 在用户配置文件中set标签进行配置,cascade值save-update

第二步 写代码实现

(1)创建用户和角色对象,把角色放到用户里面,最终保存用户就可以了

//演示多对多修级联保存
@Test
public void testSave() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
//得到sessionFactory
sessionFactory = HibernateUtils.getSessionFactory();
//得到session
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction(); //添加两个用户,为每个用户添加两个角色
//1 创建对象
User user1 = new User();
user1.setUser_name("lucy");
user1.setUser_password("123"); User user2 = new User();
user2.setUser_name("mary");
user2.setUser_password("456"); Role r1 = new Role();
r1.setRole_name("总经理");
r1.setRole_memo("总经理"); Role r2 = new Role();
r2.setRole_name("秘书");
r2.setRole_memo("秘书"); Role r3 = new Role();
r3.setRole_name("保安");
r3.setRole_memo("保安"); //2 建立关系,把角色放到用户里面
// user1 -- r1/r2
user1.getSetRole().add(r1);
user1.getSetRole().add(r2); // user2 -- r2/r3
user2.getSetRole().add(r2);
user2.getSetRole().add(r3); //3 保存用户
session.save(user1);
session.save(user2); //提交事务
tx.commit(); }catch(Exception e) {
tx.rollback();
}finally {
session.close();
//sessionFactory不需要关闭
sessionFactory.close();
}
}

3.多对多级联删除(了解)

第一步 在set标签进行配置,cascade值delete

第二步 删除用户

4.维护第三张表关系

1 用户和角色多对多关系,维护关系通过第三张表维护

2 让某个用户有某个角色

第一步 根据id查询用户和角色

第二步 把角色放到用户里面

(1)把角色对象放到用户set集合

3 让某个用户没有某个角色

第一步 根据id查询用户和角色

第二步 从用户里面把角色去掉

(1)从set集合里面把角色移除

Hibernate_day03的更多相关文章

  1. Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作

  2. Hibernate_day03讲义_使用Hibernate完成一对多的关系映射并操作

  3. Hibernate(四)

    Hibernate的二级缓存 理解缓存定义: 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储 ...

  4. Hibernate(三)

    1.1Hibernate的检索方式 1.1.1Hibernate的检索方式概述 Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经家就在的对象导航到其他对象. Custom ...

  5. Hibernate框架笔记03表操作多对多配置

    目录 1. 数据库表与表之间的关系 1.1 一对多关系 1.2 多对多关系 1.3 一对一关系[了解] 2. Hibernate的一对多关联映射 2.1 创建一个项目,引入相关jar包 2.2. 创建 ...

  6. Hibernate框架第三天

    **课程回顾:Hibernate第二天** 1. 持久化类和一级缓存 * 持久化类:JavaBean + 映射的配置文件 * 持久化对象的三种状态 * 瞬时态 * 持久态:有自动更新数据的能力 * 托 ...

  7. Hibernate_day03--课程安排_表之间关系_一对多操作

    Hibernate_day03 上节内容 今天内容 表与表之间关系回顾(重点) Hibernate的一对多操作(重点) 一对多映射配置(重点) 一对多级联操作 一对多级联保存 一对多级联删除 一对多修 ...

  8. day36 06-Hibernate抓取策略:set集合上的抓取策略

    你在做查询的时候它可以帮你关联出它的一些相应的关联对象.那么它关联这个对象的时候是在什么时候发送的这些语句以及它是如何把这些数据拿出来的? 知道延迟检索是怎么回事了,而且它也能够产生这个代理对象.当你 ...

随机推荐

  1. html 列表 ol 、ul 、dl

    html的列表分為無序列表(ul).有序列表(ol).自定義列表(dl). 無序列表: 以<ul>開始,列表項以<li>開始: 列表項可以是段落.圖像.連接.換行符.列表等: ...

  2. Lodop不要把客户端的打印机共享到服务器上 再在客户端打印

    客户端打印需要每个客户端都安装,Lodop插件方式和C-Lodop方式,都是安装一次后,无需再次安装,c-lodop默认也是开机自启动的.集中打印方式,可以打印到某台电脑(作为云主机)上,但是不能打印 ...

  3. 【gridview增删改查】数据库查询后lodop打印

    ASP.NET中使用gridview可以很容易的把需要的数据动态显示在前台,还可以在表格里加入列进行增删改查,每次点击的时候重新加载数据,gridview也提供了分页等功能,还有一些模版让显示在前台的 ...

  4. 谷歌pixel手机解BL锁、刷机、破解电信(史上最详细的帖子)

    本文根据网上已有内容进行整理,对每一个步骤都进行了实践,运气爆棚,几乎没有出现什么重大错误,小错误也进行了很好地解决.因此,十分感激那些为折腾google pixel的IT爱好者,为我提供了无穷的帮助 ...

  5. Omni(USDT)钱包安装(ubuntu)

    一.下载Omni Layer钱包 wget https://bintray.com/artifact/download/omni/OmniBinaries/omnicore-0.3.0-x86_64- ...

  6. codeforces580C

    Kefa and Park CodeForces - 580C 一棵以1为根的树,树上有些点是红的.一个叶子是合法的当且仅当从根到它的路径上出现的连续红点个数不超过m.求有多少个叶子是合法的.Inpu ...

  7. 17mysql2█▓

    一.数据库的查询用法 1. 数据表记录的查询: 运算符.虑重.列运算.别名.排序.聚合函数.分组 1.1数据准备 create table exam(   id int primary key aut ...

  8. BZOJ3160 万径人踪灭(FFT+manacher)

    容易想到先统计回文串数量,这样就去掉了不连续的限制,变为统计回文序列数量. 显然以某个位置为对称轴的回文序列数量就是2其两边(包括自身)对称相等的位置数量-1.对称有啥性质?位置和相等.这不就是卷积嘛 ...

  9. 七牛云注册创建oss并配置自定义域名

    1.登陆官网注册账号 有个人和企业两种,根据自己的情况进行注册 https://portal.qiniu.com/signup/choice 2.注册后要进行认证,不认证是没有免费空间给你使用的 3. ...

  10. MT【50】高中曲线系集大成之双切线法

    [历史使人聪明,诗歌使人机智,数学使人精细,哲学使人深邃,道德使人严肃,逻辑与修辞使人善辩.--- Bacon,Francis] 练习: 评:这道2011高考题的解析做法参考答案也值得一看,但我这边在 ...