Hibernate持久化类、主键生成策略、持久户对象、一级缓存、事务和五种检索方式
来源:互联网 发布:邮政网络培训学院官网 编辑:程序博客网 时间:2024/05/20 14:41
持久化类:
javabean+映射文件
持久化类的编写规范:
必须有一个无参构造器
字段必须私有且提供公共的访问方法
类中必须有一个属性(OID)和表中的主键对应
尽量属性字段使用包装类修饰
尽量不要使用final修饰类
主键生成策略:
主键分类:
自然主键:使用表中一个有意义的字段作为主键.
★代理主键:为这张表添加一个字段,没有任何业务意义,只是作为唯一标识存在.
hibernate的主键生成策略:
increment:使用的hibernate的自增策略,插入记录之前先查询表中的最大id,然后将id+1,作为该条记录 的id.仅适用于单线程
identity:使用的数据库底层的自增策略,类型为整数,例如:mysql
sequence:使用的数据库底层的序列策略,类型为整数,例如:oracle
★native:使用的是本地数据库的策略,类型为整数,可以认为不是identity就是sequence
★uuid:使用的是唯一的字符串
assigned:放弃hibernate维护主键,手动的设置oid
持久化对象:
三种状态:
瞬时态:没有oid且没有被session管理
★持久态:有oid且被session管理
脱管态:有oid但没有被session管理
三种状态的转换
瞬时态
获取:
通过new
转换:
瞬时态-->持久态
调用save()或者saveOrUpdate()
瞬时态-->脱管态
可以认为给对象设置了一个oid setId()
持久态
获取:
调用 get或者load或者其他的查询
转换:
持久态-->瞬时态
调用session.delete()
持久态-->脱管态
调用session的 close()或者 clear() 或者 evict(obj)
脱管态
获取:
我们可以认为
创建一个对象,设置一个oid
转换:
脱管态-->持久态
调用session的update()或者saveOrUpdate()
脱管态-->瞬时态
可以认为将对象的oid设置为null
注意:★
持久态对象可以自动更新数据库.(依赖于hibernate的一级缓存)
一级缓存:
缓存:
介于应用程序和硬件之间的一个桥梁.
作用:减少对硬件的访问.
hibernate是一个封装了jdbc的框架.所以效率没有jdbc高,为了提高效率,hibernate提供了一系列的优 化策略,例如:缓存.
hibernate的一级缓存依赖的java中集合.
一级缓存中主要分成两块区域,一块叫做缓存区,一块叫做快照区.
hibernate中获取对象的时候,优先从缓存中查找
若找到:直接返回
若找不到:去数据库中查询,查询到之后放入缓存中一份.
当执行保存或者更新操作的时候,也会放入缓存中一份.
★放入缓存中数据,其实放入缓存区一份,也放入快照区一份.
操作的时候,操作的缓存区中的数据.
当事务提交的时候,对比缓存区中数据和快照区中数据是否一致
若一致:啥都不做
若不一致:会发送update语句
扩展:
一级缓存,hibernate自带的,不能卸载.生命周期和session的生命周期一致,称之为session级别的缓存
二级缓存,不是hibernate自带的.需要配置才能使用(ehcache).一般使用redis替代.
生命周期和sessionFactory生命周期一样,所以也称之为sesssionFactory级别的缓存.
事务:
事务就是一件完整的事情.可以包含多个操作单元,这些操作单元要么全部成功,要么全部失败.
事务的特性:
Atomicity、Consistency、Isolation、Durability
原子性:事务不可分割
一致性:事务执行前后的业务状态要和其他的业务状态一致.
隔离性:将每个事务隔离起来.尽量不受其他事务干扰
持久性:事务一旦提交,终将要保存到数据库中.
不考虑隔离性会产生的问题:
脏读
不可重复读 两次查询的结果 针对于update
虚读 两次查询的结果 针对于insert
可以通过设置事务的隔离级别避免问题:
1 read uncommited 读未提交,什么都不能避免
2 read commited 读已提交,避免脏读(oracle默认)
4 repeatable read 可重复读,避免脏读和不可重复读(mysql默认)
8 serializable 串行化,可以避免所有问题
hibernate中的隔离级别:
只需要在核心配置文件中配置
4</>
事务控制:
事务加载service层.必须使用连接对象.如何保证service层和dao层在同一个事务中.
只需要保证他们使用的是同一个连接.如何保证呢:
方式1:向下传递连接
★方式2:使用★ThreadLocal(将连接和当前的线程绑定)
hibernate中事务控制:
hibernate只是对connection的事务进行了封装.
若想使用手动控制事务,hibernate封装了线程绑定session的方式
使用当前线程中的session
1.配置核心文件
thread
2.就可以在java中通过
factory.getCurrentSession()获取了
注意:
若使用getCurrentSession方法,session对象不需要手动关闭.
5种检索方式:
1.oid检索(get和load)
2.对象导航:当配置了级联时,对象内会保存有级联的对象信息
3.hql检索
面向对象.
hql语句中不能出现表名和字段名.hql语句和sql语句很相似.
获取Query对象
session.createQuery(hql语句);
例如:
session.createQuery("from 类名")
方法:
list()
分页:
setFirstResult(开始的索引)
setMaxResults(每页显示的条数)
条件:hql和sql写法类型
设置参数:setParameter(int 问号索引,object 值);
唯一:
uniqueResult();
4.qbc检索
query by criteria
更加面向对象.看不到sql的影子.全部是方法
获取Criteria对象
session.createCriteria(Class);
方法:
所有:
list()
唯一:
uniqueResult()
分页:
setFirstResult(开始的索引)
setMaxResults(每页显示的条数)
条件:
add(Restrictions.eq | lt | gt | in | like("属性名",值));
5.sql检索
获取SqlQuery:
session.createSqlQuery(sql语句)
将每条记录封装成指定的实体
addEntity(class)
待续……
- Hibernate持久化类、主键生成策略、持久户对象、一级缓存、事务和五种检索方式
- hibernate之持久化类,主键生成策略,事务,缓存,查询api(02)
- hibernate 一级缓存(Session缓存)和持久化对象的四种状态
- Hibernate主键生成策略和持久化对象的三种状态和MySql常用的数据库语句
- Hibernate持久化类与主键生成策略
- Hibernate持久化类与主键生成策略
- Hibernate学习-10:持久化类、主键生成策略
- 【SSH】Hibernate学习(二)主键生成策略、对象状态、一级缓存、事务、HQL
- hibernate_持久化类、主键生成策略
- Hibernate——(5)持久化对象和一级缓存机制
- Hibernate——(5)持久化对象和一级缓存机制
- hibernate持久化类&持久化对象(五)
- 【03】框架学习—Hibernate持久化类/持久化对象的状态/事务与并发/查询方式
- Hibernate的持久化对象加载策略
- HIBERNATE的持久化对象加载策略
- JPA(Java 持久化技术规范)中的主键生成策略
- Java 持久化技术规范(JPA )中的主键生成策略
- Java 持久化技术规范(JPA )中的主键生成策略
- Struts框架_概述、搭建、架构、配置详解及ActionAPI
- Qt5安装后QtCreator控件,代码中中文输入法不可用
- Struts2的结果类型、ServletAPI获取、参数接收
- 惊人的超速学习实验
- 使用jpush-client-sdk实现极光jpush
- Hibernate持久化类、主键生成策略、持久户对象、一级缓存、事务和五种检索方式
- 优秀电子工程师成长之道【转】
- Hibernate概述、入门、配置文件详解、四大API详解
- Servlet文件上传
- 一篇关于齐纳二极管的不错的论述【转载】
- IDEA中一个很有用的内存调试插件
- 适合女大学生看的书
- OGNL表达式与struts2整合应用
- Echarts的初学者应该掌握的知识