hibernate笔记
2019独角兽企业重金招聘Python工程师标准>>>
* 检索策略
* 区分类级别和关联级别检索
1)类级别检索:直接加载目标对象本身----Customer c = session.get(Customer.class,1);
2)关联级别检索:通过检索到的对象导航到关联的对象---Customer c = session.get(Customer.class,1);c.getOrders();
* 关联级别检索中,由一方(客户)关联查询多方(订单)
在Customer.hbm.xml中<set>,两个属性 fetch lazy
a. fetch="join" lazy将被忽略 ---查询客户时,会立即查询订单,sql形式为左外连接查询
b. fetch="select"
lazy="false"---查询客户时,会立即查询订单,sql形式为多条sql查询-----select * from customer where id = 1;select * from orders where cid = 1;
lazy="true"----查询客户时,不会立即查询订单,当访问订单集合size时,发出sql查询订单详情----select * from orders where cid = 1;
lazy="extra"---查询客户时,不会立即查询订单,
当访问订单集合size时,发出sql统计订单数量---select count(id) from orders where cid = 1;
当访问订单属性时,发出sql查询订单真实信息---select * from orders where cid = 1;
c. fetch="subselct"
lazy="false"---查询客户时,会立即查询订单,sql形式为子查询---select * from orders where cid in(select id from customer)
lazy="true"----查询客户时,不会立即查询订单,当访问订单集合size时,发出sql查询订单详情---select * from orders where cid in(select id from customer)
lazy="extra"---查询客户时,不会立即查询订单,
当访问订单集合size时,发出sql统计订单数量---select count(id) from orders where cid = 1;
当访问订单属性时,发出sql查询订单真实信息,sql形式为子查询---select * from orders where cid in(select id from customer)
* 当使用Query.list(hql)方法查询时,会忽略fetch="join",是延迟还是立即检索订单,由lazy决定
* 关联级别检索中,由多方(订单)关联查询一方(客户)
在Order.hbm.xml中<many-to-one>,两个属性 fetch lazy
a. fetch="join" lazy被忽略---查询订单时,会立即查询订单关联的客户,sql形式为左外连接查询---select o.*,c.* from orders o left outer join customer c on c.id = o.cid and o.id = ?
b. fetch="select"
lazy="false":查询订单时,会立即查询订单关联的客户,sql行为为多条sql--select * from orders where id = ?;select * from customer where id = ?
lazy="proxy":
如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="false">---立即查询客户
如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="true">---不会立即查询客户
* 当使用Query.list(hql)方法查询时,会忽略fetch="join",是延迟还是立即检索客户,由Customer.hbm.xml类级别检索策略决定
如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="false">---立即查询客户
如果Customer.hbm.xml中配置<class name="cn.itcast.domain.Customer" lazy="true">---不会立即查询客户
* 批量检索----减少sql数量,提供查询效率
查询所有客户时,在Customer.hbm.xml中<set batch-size="5">---表示一次最多可以查询5个客户的订单
查询所有订单时,在Customer.hbm.xml中<class name="cn.itcast.domain.Customer" batch-size="5">---一次最多查询5个客户
---------------------------------------------------
ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)、一致性(Consistency)、隔离性 (Isolation)、持久性(Durability)
* 事务并发引发的问题:
1)脏读:一个事务读取到了另一个事务没有提交的数据
2)幻读:一个事务读取到了另一个事务提交的数据(insert)
3)不可重复读:一个事务读取到了另一个事务提交的数据(update)
4)丢失更新:后一个事务覆盖了前一个事务提交的数据
* 解决丢失更新问题
1)悲观锁:使用数据库底层锁机制,锁定操作的数据,防止并发发生
2)乐观锁:在持久化类中添加版本字段,当事务提交时,比较提交的版本是否和数据库中的版本字段一致,如果不一致,抛出异常阻止修改
public class User {
private Integer id;
private String name;
private Integer age;
//版本字段
private Integer ver;
User.hbm.xml中
<class name="cn.itcast.domain.User" table="user">
<id name="id">
<generator class="native"></generator>
</id>
<!-- 加入版本字段 -->
<version name="ver" type="integer"></version>
<property name="name" length="20"></property>
<property name="age"></property>
</class>
* hibernate缓存分为一级缓存和二级缓存
一级缓存为hibernate内置缓存,不用配置
二级缓存为外置缓存,hibernate框架没有提供二级缓存的实现,要使用二级缓存,需要借助第三方产品
* 配置二级缓存
1)将EHCache相关jar导入项目
2)将EHCache核心配置文件放在src下ehcache.xml
3)在hibernate.cfg.xml中开启二级缓存
!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
4)指定二级缓存提供商:
<!-- 指定二级缓存提供商 -->
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
5)在hibernate.cfg.xml中配置哪些类和集合使用二级缓存
<!-- 配置哪些类和集合放入二级缓存 -->
<class-cache usage="read-write" class="cn.itcast.domain.Customer"/>
<class-cache usage="read-write" class="cn.itcast.domain.Order"/>
<collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/>
* 配置查询缓存
hibernate.cfg.xml中配置
<!-- 配置使用查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
Session session1 = HibernateUtils.getSession();
Transaction tx1 = session1.beginTransaction();
Query query = session1.createQuery("from Customer");
query.setCacheable(true);//使用查询缓存,将查询出的数据放入查询缓存中
query.list();//将查询出的数据放入一级缓存和二级缓存
Query query2 = session1.createQuery("from Customer");
query2.setCacheable(true);//使用查询缓存
query2.list();//不会发出sql,直接从查询缓存中获取
tx1.commit();
session1.close();
转载于:https://my.oschina.net/yangzhiyuan/blog/208096
hibernate笔记相关推荐
- Hibernate 笔记 HQL查询
http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html Hibernate 笔记 HQL查询(一)单属性,多属性查询 H ...
- Hibernate笔记节选
为大家整理了一下前两天的Hibernate笔记 来源:ganbin ************************ ?saxT * Hibernate课件 * LEuDw| ******* ...
- 2.[精通Hibernate笔记]整合Spring
Spring3.0已不再支持Hibernate2.x,仅为Hibernate3.x提供支持,且要求Hibernate必须在3.2版本以上. 配置SessionFactory 使用Hibernate框架 ...
- Hibernate 笔记1
Hibernate表generator标签的作用,如下图,
- hibernate笔记--缓存机制之 一级缓存(session缓存)
一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...
- Hibernate 笔记 缓存
1 Hibernate 缓存 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间.ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则 ...
- Hibernate 笔记4 实现对数据库的增删改查
1 准备 首先在mysql数据库中建表User,并添加相关信息. user表结构如下. +-------+--------------+------+-----+---------+-------- ...
- 汤阳光 Hibernate笔记
2019独角兽企业重金招聘Python工程师标准>>> 1. Hibernate检索 1.1. hibernate检索方式说明 Hibernate 提供了以下几种检索对象的方式 导航 ...
- Hibernate笔记2
hibernate实体的状态 实体Entity有三种状态,瞬时状态,持久状态,脱管状态 瞬时状态:transient,session 没有缓存,数据库也没有记录,oid没有值 持久状态:persist ...
最新文章
- mysql 改变枚举值_mysql 改变数据类型为枚举不成功?
- 山科大计算机专业排名,山东科技大学专业排名情况
- static关键字的使用
- python爬虫登陆网页版腾讯课堂
- 动态代理源码分析,实现自己的动态代理
- 小度智能音响拆解 芯片_拆解报告:小度人工智能音箱1S
- 未来的人工智能和 AR/VR 会从哪些方面影响教育?有什么机会?
- 计算机打印基础知识教程,员工计算机基础知识普及教程(ppt 84页)
- background-image使用
- 安装caffe中间遇到的一些问题
- C版iPhone4也给国产旗舰手机带来机会
- 超声波测距 c语言程序流程图,超声波测距程序(详细C语言数码管显示)
- ssh连接超时解决方法
- Chrome浏览器设置黑色模式
- server sent event
- 传统责任链模式和变种责任链模式
- 【蓝桥杯嵌入式备赛】10.拓展板数码管、ADC按键及光敏电阻
- java中循环右移两位_1008 数组元素循环右移问题 (20分)【java题解】
- c语言代码运行成图指令代码,C语言图形编程代码.doc
- 硬件描述语言VHDL之并行语句基本使用介绍
热门文章
- confluence mysql 中文乱码_解决confluence的乱码问题
- sentinel使用(结合OpenFeign)
- SpringBoot请求日期参数异常(Failed-to-convert-value-of-type-'java-lang-String'-
- Docker搭建网页数据库管理-Adminer
- QT信号与槽——观察者模式——回调函数
- Tomcat单向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端安全通信
- 想转行软件测试,简历怎么包装成1年工作经验的测试工程师
- python 数据逐个验证_在python中验证数据的最佳方法是什么?
- 系统延时任务和定时任务
- python函数拟合不规则曲线_python中的多变量(多项式)最佳拟合曲线?