持久化类
持久化:将内存中的数据存入硬盘中以便持久保存的过程。Hibernate框架就用于持久化的框架。
持久化类:一个Java类与数据库表建立了映射关系,那么这个类在hibernate框架中就称为持久化类。定义一个持久化类需要一个Java类和与之对应的映射文件。
持久化类的要求
1、构成持久化类的Java类必须提供一个无参构造方法,因为Hibernate底层需要用到反射机制来生成持久化类的实例;
2、构成持久化类的Java类的属性要求私有,并且提供public的get/set方法用于Hibernate对于属性值的获取和修改;
3、构成持久化类的Java类必须提供一个唯一标识与数据库的主键对应,Hibernate需要根据Java对象的标识将其与数据库中主键对应的记录进行映射;
4、构成持久化类的Java类的属性尽量使用包装类,因为如果某个属性如果没有赋值,基本数据类型会有默认值,这样就会混淆空值与默认值;
5、构成持久化类的Java类不能用final修饰,这个要求是为了保证像load()等方法能够生成一个代理类对象,这个代理类是底层生成的,它需要继承构成持久化类的Java类。如果用final修饰修饰了,那么load()方法与get()方法一样获得的是构成持久化类的Java类,并且打印SQL的时机也一致,例:
- 构成持久化类的Java类没有用final修饰时,get()方法打印顺序如下:
- 构成持久化类的Java类没有用final修饰时,load()方法打印顺序如下:
- 构成持久化类的Java类用final修饰时,get()方法打印顺序如下:
持久化类对象的状态及其转换
Hibernate为了更好的管理持久化类,将持久化类分为三种状态:瞬时态、持久态和脱管态,它们的特征及转换如下:
1、瞬时态(Transient):没有对象唯一标识,没被session管理
瞬时态对象的获取:用new关键字创建一个没有id的持久化类即为瞬时态对象
瞬时态转持久态:瞬时态对象被session对象执行save()或saveOrUpdate()方法
瞬时态转脱管态:为瞬时态对象赋一个对象唯一标识id,该id的值对应的主键要存在
2、持久态(Persistent):有对象唯一标识,被session管理
持久态对象的获取:Session对象调用get()、load()等方法获得的持久化类即为持久态对象
持久态转脱管态:Sesion对象调用evict()、close()或clear()方法
持久态转瞬时态:被Session对象执行delete()方法
3、脱管态(Detached):有对象唯一标识,没被session管理
脱管态对象的获取:可通过其他状态对象转换获得
脱管态转持久态:被Session对象执行update()、saveOrUpdate()或lock()方法
脱管态转瞬时态:将脱管态对象的对象唯一标识设置为null
持久态对象的特性:自动更新数据库
例如操作以下表:
代码如下:
package cn.jingpengchong.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import cn.jingpengchong.pojo.Customer;
public class Test {
public static void main(String[] args) {
//1、加载配置文件
Configuration configure = new Configuration().configure();
//2、创建一个SessionFactory
SessionFactory factory = configure.buildSessionFactory();
//3、根据SessionFactory获得一个Session对象
Session session = factory.openSession();
//4、手动开启事务
Transaction transaction = session.beginTransaction();
//5、执行增删改查等操作
Customer customer = session.get(Customer.class, 3l);
customer.setName("齐天大圣");
//6、提交事务
transaction.commit();
//7、释放资源
session.close();
factory.close();
}
}
运行结果如下:
可以看到代码里面并没有调用update()方法,却执行了更新操作(事务提交时更新的),再看数据库中也确实被修改了:
再次执行上面的代码(不做任何修改),此时由于数据没有改变,所以不会打印更新语句了,数据库也当然没有任何变化。
问:那么Hibernate实现这么智能的操作是依靠什么原理呢?
答:Hibernate的一级缓存!
问:什么是Hibernate的一级缓存?
答:请听下回分解!