【SSH】SSH之Hibernate框架:持久化类及其要求和对象的状态

持久化类

持久化:将内存中的数据存入硬盘中以便持久保存的过程。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的一级缓存?
:请听下回分解!

发布了128 篇原创文章 · 获赞 17 · 访问量 2728

猜你喜欢

转载自blog.csdn.net/qq_43705275/article/details/104223305