什么是持久化类:
持久化,就是将内存中的数据永久存储到关系型数据库中,持久化类指的是一个Java类与数据库建立了映射关系,那么称这个类为持久化类
持久化类编写规则:
- 持久化类需要提供无参数的构造方法.因为在Hibernate的底层需要使用反射生成类的实力
- 持久化类的属性需要私有,对私有的属性提供公有的get和set方法.因为在Hibernate底层会将查询到的数据进行封装
- 持久化类的属性要尽量使用包装类的类型.因为包装类和基本数据类型的默认值不同,包装类的类型语义描述更清晰而基本数据类型不容易描述
- 持久化类要有一个唯一表示OID与表的主键对应.
- 持久化类尽量不要使用final进行修饰.因为Hibernate有延迟加载的机制,这个机制中会产生代理对象,其实就是产生了当前类的一个子类对象实现的,如果使用final修饰,不能产生子类
主键的类型:
- 自然主键:把具有业务含义的字段作为主键
- 代理主键:把不具有业务含义的字段作为主键
Hibernate的主键生成策略
Hibernate的持久化对象的三种状态
- 瞬时态(transient):瞬时态也称为临时态或自由态,瞬时态的实例是由new命令创建,开辟内存空间的对象,不存在持久化标识OID,尚未与Hibernate Session关联,在数据库中也没有记录,失去引用后被JVM回收.瞬时状态的对象在内存中是孤立存在的,与数据库中的数据无任何关联,仅是一个信息携带的载体
- 持久态(persistent):持久态的对象存在持久化标识OID,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录,每条记录只对应唯一的持久化对象.P.S持久态对象是事务还未提交前变成持久态的.
- 脱管态(detached):脱管态也成为离线态或游离态,当某个持久化状态的实例与Session的关联被关闭时就变成了脱管态.脱管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联,脱管状态对象发生改变时,Hibernate不能检测到
Hibernate持久化对象的三种状态转换
瞬时态转换为脱管态:为瞬时态对象设置持久化标识ID
Customer customer = new Customer();//瞬时态
customer.setCust_id(1);//脱管态
Hibernate的一级缓存
持久态对象能够自动更新数据,依赖于Hibernate的一级缓存