Hibernate中的主键生成策略&一级缓存&事务管理&其它API
持久化类的编写规则:
- 持久化:就是将内存中的一个对象持久化到数据库中的过程。hibernate框架就是用来进行持久化的框架。
- 持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在hibernate中称为是持久化类。
持久化类=Java类+映射文件
规则 | 说明 |
---|---|
对持久化类提供一个无参的构造方法 | hibernate底层需要使用反射生成实例 |
属性需要私有,对私有属性提供pubic的get和set方法 | hibernate中获取,设置对象的值 |
对持久化类提供一个唯一标识OID与数据库主键对应 | java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一个记录,在hibernate中通过持久化类的OID的属性区分是否是同一个对象 |
持久化类中属性尽量使用包装类类型 | 避免歧义 |
持久化类不要使用final进行修饰 | 延迟加载本身是hibernate一个优化手段。返回的是一个代理对象。如果不能产生代理对象,延迟加载也就失效。load方法和get方法一致 |
一、主键生成策略
主键的类型:
- 自然主键:把具有业务含义的字段作为主键。
- 代理主键:把不具有业务含义的字段作为主键。(推荐)
二、 Hibernate的持久化类的三种状态:
1.瞬时态(transient):不存在持久化标识OID,尚未与hibernate Session关联。在数据库中也没有记录
2.持久态(persistent):存在持久化标识OID,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录。注:持久态对象是在事务还未提交前变成持久态的。
3.脱管态(detached):脱管态对象存在持久化标识OID,并且任然与数据库中的数据存在关联,只是失去了与当前Session的关联。托管状态对象发生改变时Hibernate不能检测到。
区分对象的三种状态:
三种状态的转换图:
持久化对象能够自动更新数据库:(依赖hibernate的一级缓存)
三、 一级缓存
缓存:提高应用的运行性能。
Hibernate的缓存分为一级缓存,二级缓存。
- 一级缓存:(Session缓存)生命周期和Session一样,其作用是减少对数据库的访问次数。是hibernate的内置缓存,不能被卸载。
- 二级缓存:
一级缓存的特点:
- 当程序调用Session接口的sava()、update()、savaOrUpdate()时,如果缓存中没有相应的对象,hibernate就会自动把从数据库中查询到的相应对象信息加入到一级缓存
*当调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法是,会在缓存中判断该对象是否存在,有则返回,无则去数据库中查询并添加到一级缓存
*当调用Session的close()、方法时,Session缓存会被清空。
证明一级缓存存在:
一级缓存的内部结构:(快照区)
四、 事务管理
事务:
事务的四个特性:
事务的并发问题:
事务的隔离级别:
Hibernate中的事务管理:
在配置文件中设置事务的隔离级别:hibernate.cfg.xml文件中的标记中进行的。
事务管理:线程绑定的Session
其实最主要的是如何保证在Service中开启事务时使用的Session对象和DAO中多个操作使用的是同一个Session对象。
实现的两种办法:
可以在业务层获取到Session,并将Session作为参数传递给DAO
可以使用ThreadLocal将业务层获取的Session绑定到当前线程中,然后在DAO 中获取Session的时候,都从当前线程中获取
1、在hibernate.cfg.xml中进行如下配置:
2、更改工具类:
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
五、Hibernate的其它API
- Query
Query接口用于接收HQL,查询多个对象。
HQL:hibernate query language Hibernate查询语言,其与SQL与发类似,面向对象的查询语言。
- Criteria
Criteria:QBC(Query By Criteria)
更加面向对象的一种查询方式。
*SQLQuery
SQLQuery接口用于接收一个sql语句进行查询
方法:list()
uniqueResult()
调用这二者中的一个进行查询。