前言:
Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据持久存储到关系型数据库中。所谓持久化类指的是一个java类与数据库表建立了映射关系,那么这个类成为持久化类。可以简单的理解为持久化类就是一个Java类有了一个映射文件与数据库的表建立了关系。
一:持久化类的编写规则:
1)持久化类需要提供无参树数的构造方法。因为在Hibernate的底层需要使用反射生成类的实例。
2)持久化类的属性需要私有,对私有的属性提供公有的get和set方法。因为Hibernate底层会将查询到的数据进行封装。
3)持久化类的属性要尽量使用包装类的类型。因为包装类和基本数据类型的默认值不同,包装类的类型语义描述更清晰而基本数据类型不容易描述。
假设学生的成绩表中有一列学生成绩,如果使用double类型,如果某个学生没有参加考试,则系统的默认值0存入的数据库中,学生考了0分也是0,这个0有多重含义。如果使用包装类型就会避免这种情况,如果没参加考试,成绩就会存入null,考了0分就会存入0,不会产生歧义。
4)持久化类要有一个唯一标识OID与表的主键对应。
5)持久化类尽量不要使用final进行修饰。
二:Hibernate主键生成策略:
主键的类型:
自然主键:把具有业务含义的字段作为主键,称之为自然主键。
代理主键:把不具备业务含义的字段作为主键,称之为代理主键。
内置的主键生成策略:
Hibernate的持久化对象的三种状态:
Hibernate为了更好的管理持久化类,在Hibernate中将持久化的对象划分成了三种状态,分别是瞬时态、持久态和托管态。
1、瞬时态(transient)
瞬时态也成为临时态或者自由态,瞬时态的实例是由new命令创建、开辟内存空间的对象,不存在持久化标识OID(相当于主键),尚未与Hibernate Session关联,在数据库中也没有记录,失去引用后将被JVM回收。瞬时状态的对象在内存中是孤立存在的,与数据库中的数据无任何关联,仅是一个信息携带的载体。
2、持久态(persistent)
持久态的对象存在持久化标识OID,加入到了Session缓存中,并且向关联的Session没有关闭,在数据库中有对应的记录,每条记录只对应唯一的持久化对象,需要注意的是,持久态对象是在事务还未提交前变为持久态的。
3、脱管态(detached)
脱管态也称离线态或者游离态,在某个持久化状态的实例与Session的关联被关闭时就变成了脱管态。脱管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联,脱管状态对象发生改变时Hibernate不能检测的。
实例:
@Test
//三种状态
public void fun1(){
//1.获得session
Session session = HibernateUtils.openSession();
//2.控制事务
Transaction tx = session.beginTransaction();
//3.执行操作
Customer c=new Customer(); //没有id,没有与session关联=>瞬时状态
c.setCust_name("联想"); //瞬时状态
session.save(c);//有id,有关联=>持久化状态
//4提交事务,关闭资源
tx.commit();
session.close(); //有id,没有关联=>游离|托管状态
}
三种状态的转换:
总结:
无论是持久化类的编写规则还是主键生成策略还是持久化对象的是种状态,都要在理解的基础上不断的实践,仅仅掌握理论还是远远不够的。