2 Hibernate持久化类详解
上接Hibernate入门学习:https://blog.csdn.net/biggerchong/article/details/84229658
目录
2.1持久化类的编写规则
- 对持久化类提供一个无参数的构造方法:
Hibernate底层需要使用反射生成实例
- 属性需要私有,对私有属性提供public的get/set方法:
Hibernate中获取设置对象的值
- 对持久化类提供一个唯一标识OID(Object Identifier,对象标识符又称为物联网域名)与数据库主键对应:
Java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一个记录,在Hibernate中通过持久化类的OID的属性区分是否是同一个对象。
- 持久化类中的属性尽量使用包装类类型:
对应数据库中的NULL
- 持久化类不要使用final进行修饰:
Hibernate中的延迟加载是其优化手段,返回的是一个代理对象,如果不能被继承将变的毫无意义。
2.2主键生成策略
2.2.1主键的分类
自然主键:主键的本身是表中必须的一个字段(实体中的一个具体的属性)
代理主键:主键的本身不是表中必须的字段(不是实体中某个具体的属性)
在实际开发中尽量使用代理主键:
- 一旦有自然主键参与到业务逻辑中,后期修改维护难度大大提升
- 好的程序设计满足OCP原则:对程序的扩展是open的,对程序的修改是close的
2.2.2 hibernate中主键生成策略
在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。在Hibernate中微量减少程序编写提供了很多种的主键成成策略。
- increment:Hibernate中提供的自动增长机制,适用short、int、long类型的主键,单线程中使用
- identity:适用以上三种类型的主键,使用数据库底层自动增强机制。适用于有自动增强机制数据库(MYSQL、 MSSQL),Oralce不适用
- sequence:适用以上三种类型主键,采用序列的方式,支持Oracle。(MYSQL、MSSQL不支持)
- uuid:适用于字符串类型的主键,使用hibernate中的随机方式生成字符串主键
- native:本地策略,可以根据数据库自动在identity、sequence间切换
- assigned:Hibernate放弃主键的管理,需要手动表写程序或者用户自己设置
- foreign:外部的一对一的一种关联映射情况下使用。(了解)
2.2.3 持久类对象3种状态
瞬时态对象:没有OID标识,不被session管理
获得:
Customer customer = new Customer( );
状态转换:
瞬时—>持久
save(Object o)、saveOrUpdate(Object o)
瞬时—>脱管
customer.setCstr_id(Long long);
持久态对象:有OID标识,被session管理; 持久态对象具有自动更新数据库的功能,不用额外session.update( );这是因为Hibernate一级缓存机制的存在。
获得:
- session.get(Customer.class,id);
- session.load(Customer.class,id);
- session.find(..);
- session.Iterate(..);
状态转换:
持久—>瞬时
session.delete(..)
持久—>脱管
session.close(); clear(); evict(Object o);
脱管态对象:有OID标识,不被session管理
获得:
Customer customer = new Customer( );
Customer.setCstr_id(Long long);
状态转换:
脱管—>持久
update(Object o)、saveOrUpdate(Object o)
脱管—> 瞬时
customer.setCstr_id(null);
2.2.4 Hibernate一级缓存
2.2.5 Hibernate事务管理
事务:事务指的是逻辑上的一组操作,做成这组操作的各个逻辑单元要么全都成功,要么 全都失败。
事务特性:
- 原子性:代表事务不可分割
- 一致性:代表事务执行前后,数据的完整性保持一致
- 隔离性:代表一个事务执行的过程中,不会受到其他事务的干扰
- 持久性:代表事务执行完毕后,数据就会持久到数据库中
如果不考虑隔离性将会产生的安全性问题?
读问题:
脏读:一个事务读到另一个为提交的数据。
不可重复读: 一个事务读到领一个事务已经提交的update数据,导致前一个事务多次查询结果不一致。
虚读: 一个事务读到另一个事务已经提交的insert数据,导致前一个事务多次查新结果不一致。
写问题(了解): 引发两类丢失更新
读问题的解决:
设置事务的隔离级别(红色为重点):
Read uncommitted: 以上读问题都会发生
Read committed: 解决脏读,但是不可重复读和虚读有可能发生
Repeatable read: 解决脏读和不可重复读,但是虚读有可能发生
Serializable:解决所有读问题,但是耗资源耗时(不推荐)
Hibernate中设置事务隔离级别:
<property name=”hibernate.connection.isolation”>4</property>
2.3Hibernate的其他API
自定义封装的Session工具类
2.3.1 Query
Query接口用于接收HQL(Hibernate Query language),HQL是Hibernate查询语言,与SQL语言类似,是一种面向对象的查询语言。
2.3.2 Criteria
Criteria:QBC( Query By Criteria ),更加面向对象的一种查询方式。
2.3.3 SQLQuery
SQLQuery用于接收SQL语句,是在SQL查询特别复杂的情况下使用SQL。
下接Hibernate关联映射(一对多/多对多):https://blog.csdn.net/biggerchong/article/details/84340105
-----谢谢阅读! ---------知飞翀