A.概念java
持久化:将内存中的对象持久化(存储)到数据库的过程。Hibernate就是持久化的框架。mysql
持久化类:一个普通java对象与数据库的表创建了映射关系,那么这个类在Hiberna中被称为持久化类。(通俗一点就是java类+映射文件)sql
B.持久化类的编写规则数据库
1.对持久化类提供一个无参构造方法。编程
固然,若是你什么构造都不写,默认仍是有无参的。提供无参构造是为了Hibernate底层能反射生成该持久化类的实例。缓存
2.属性须要私有,对私有属性提供public的get和set方法。session
因为底层建立了该持久化类的实例,Hibernate就要开始设置属性的值多线程
3.对持久化类提供一个惟一标识的OID,与数据库主键对应。oracle
java中经过对象地址值是否相同区分是不是同一个对象,数据库中经过主键肯定是不是同一个记录。而在Hibernate中经过持久化类的OID属性来区分是不是同一对象框架
4.持久化类的属性尽可能使用包装类类型。
好比基本数据类型如int,若是是0的话,多是默认,也多是数值,而改为包装类型的话,默认为空,0是数值等等
5.持久化类不要使用final进行修饰。
首先,用final修饰的类不能继承,而Hibernate中则有一个优化手段(延迟加载),经过返回一个代理对象来管理数据,Hibernate引入的javasist的jar包能够对没有实现接口的类产生代理,主要就是经过继承这个类来实现代理,若是不能被继承,延迟加载技术就失效,load和get方法就没区别了
C.主键生成策略
1.概念:
在实际开发中,通常不容许用户手动设置数据库的主键(统一规范),因此将主键交给数据库,手动编程设置。Hibernate中为了减小程序的编写,提供了不少的主键生成策略
2.主键的分类
通常用后面的代理主键。一旦天然主键参与业务逻辑编码中,后期变更可能须要修改源码。
3.Hibernate中的主要生成策略
D.持久化类的三种状态。
Hibernate为了更好的管理持久化类。将持久化类分为三种状态
1.瞬时态(transient)
对象没有惟一的标识OID,没有session管理。
获取:
Customer customer = new Customer()//对象刚开始建立,没有被赋值标识OID
状态转化:
瞬时——>持久 save() saveOrUpdate(Object obj)
瞬时——>脱管 customer.setId(1L);
2.持久态(presistent)
对象有惟一的标识OID。有session管理
得到:get() load()
状态转化:
持久——>瞬时:delete()
持久——>脱管 close(),clear() evict()(清除单个对象)
3.脱管态(Detached)
对象有惟一的标识OID,没有被session管理
获取:(官网没有给如何直接获取,可是能够获取)
Customer customer = new Customer(); customer.setId(1L);
状态转化:
脱管——>持久: update() saveOrUpdate()
脱管——>瞬时 setId(null);
持久化对象的特性:
自动跟新数据库:
给持久化对象设置新的属性,先用get获取,再设置值,不用update,只要事务提交,也能更新数据库
原理:Hibernate有一级缓存,会备份一份数据在Hibernate的快照区,当你在内存中改变持久化对象里面的属性值时候,会在提交后自动和快照区对比,不同,更新数据库和快照区。(只有当你设置的值和数据库里面不一致的时候才自动更新)
Customer cust = session.get(Customer.class,1L); cust.setName("张三"); tx.commit()