Hibernate的持久化类
什么是持久化类
- 持久化类:就是一个Java类(JavaBean),
并且这个【Java类】通过xml配置文件与数据库中的 【表】建立了映射关系就可以成为是持久化类。
总结:持久化类 = JavaBean + xxx.hbm.xml
持久化类的编写规则
- 提供一个无参数 public访问控制符的构造器 -- 底层需要进行反射.
- 提供一个标识属性,映射数据表主键字段 -- 唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识OID确定记录
- 所有属性提供public访问控制符的 set或者get 方法
- 标识属性应尽量使用基本数据类型的包装类型
区分自然主键和代理主键
- 创建表的时候
- 自然主键:对象本身的一个属性.创建一个人员表,每个人都有一个身份证号.(唯一的)使用身份证号作为表的主键.自然主键.(开发中不会使用这种方式)
- 代理主键:不是对象本身的一个属性.创建一个人员表,为每个人员单独创建一个字段.用这个字段作为主键.代理主键.(开发中推荐使用这种方式)
- 创建表的时候尽量使用代理主键创建表
主键的生成策略
- increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制.
Hibernate中提供的一种增长机制.
先进行查询 :select max(id) from user;
再进行插入 :获得最大值+1作为新的记录的主键.
缺陷:不能在集群环境下或者有并发访问的情况下使用.
- identity:适用于short,int,long作为主键。但是这个必须使用在有自动增长数据库中.采用的是数据库底层的自动增长机制.
- 底层使用的是数据库的自动增长(auto_increment).像Oracle数据库没有自动增长.
- sequence:适用于short,int,long作为主键.底层使用的是序列的增长方式.
- Oracle数据库底层没有自动增长,想自动增长需要使用序列.
- uuid:适用于char,varchar类型的作为主键.
- 使用随机的字符串作为主键.
- native:本地策略.根据底层的数据库不同,自动选择适用于该种数据库的生成策略.(short,int,long)
- 如果底层使用的MySQL数据库:相当于identity.
- 如果底层使用Oracle数据库:相当于sequence.
- assigned:主键的生成不用Hibernate管理了.必须手动设置主键.
Hibernate持久化对象的状态
持久化对象的状态
- Hibernate的持久化类
- 持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.
- 持久化类 = Java类 + hbm的配置文件
- Hibernate的持久化类的状态
-
Hibernate为了管理持久化类:将持久化类分成了三个状态
瞬时态:Transient Object
没有持久化标识OID, 没有被纳入到Session对象的管理.持久态:Persistent Object
有持久化标识OID,已经被纳入到Session对象的管理.,对象的任何修改都会自动保存到数据库中(持久化);脱管态:Detached Object
有持久化标识OID,没有被纳入到Session对象的管理.
Hibernate持久化对象的状态的转换
- 瞬时态 -- 没有持久化标识OID, 没有被纳入到Session对象的管理
- 获得瞬时态的对象
User user = new User() - 瞬时态对象转换持久态
save()/saveOrUpdate(); - 瞬时态对象转换成脱管态
user.setId(1)
- 持久态 -- 有持久化标识OID,已经被纳入到Session对象的管理
- 获得持久态的对象
get()/load(); - 持久态转换成瞬时态对象
delete(); --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的) - 持久态对象转成脱管态对象
session的close()/evict()/clear();
- 脱管态 -- 有持久化标识OID,没有被纳入到Session对象的管理
- 获得托管态对象:不建议直接获得脱管态的对象.
User user = new User();
user.setId(1); - 脱管态对象转换成持久态对象
update();/saveOrUpdate()/lock(); - 脱管态对象转换成瞬时态对象
user.setId(null);
- 注意:持久态对象有自动更新数据库的能力!!!