Hibernate持久化对象的状态

时间:2021-12-31 08:20:51

本文所有例子:连接的MySQL数据库,

基于Book类

private Integer id; //id
private String name; //书名
private Double price; //价格

创建session静态方法:

public class HibernateUtils {
	//声明一个私有的静态final类型的Configuration对象
	private static final Configuration config;
	//声明一个私有的静态final类型的SessionFactory对象
	private static final SessionFactory factory;
	//通过静态代码块构建SessionFactory
	static {
		config = new Configuration().configure();
		factory = config.buildSessionFactory();
	}
	//提供一个公有的静态方法供外部获取,并返回一个sesison对象
	public static Session getSession() {
		return factory.openSession();
	}
}

一、持久化对象含义: 

        Hibernate是持久层ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久存储到关系型数据库中。

二、Hibernate对象:

1.临时对象(Transient):

在使用代理主键的情况下,

OID通常为null

不处于session缓存中

在数据库中没有对应的记录

2.持久化对象(托管)(Persist):

 OID不为null

位于Session缓存中

若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应

Session在flush缓存时,会根据持久化对象的属性变化,来同步更新数据库

在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象

3.游离对象(脱管)(Detached):

 OID不为null

不在处于Session缓存中

一般情况需下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

三、持久化对象的状态:

    瞬时态:此对象是由new命令创建、开辟内存空间的对象,不存在持久化标识0ID,尚未与Hibernate Sess ion关联,在数据库中也没有记录,失去引用后将被JVM回收。 

        持久态:此对象存在持久化标识0ID,在Session缓存中,并且相关联的Sess ion没有关闭,在数据库中有唯一对应的记录,注意:持久态对象是在事务还未提交前变成持久态的。

        托管态:此対象存在持久化棕枳OID,并且仍然与数据庠中的数据存在美朕,只是失去了与当前Session的美朕,脱管状杰対象爰生改変吋Hibernate不能检测到。

Hibernate持久化对象的状态

	// 1.演示持久化对象三种状态
	@Test
	public void test1() {
		// 1.得到session
		Session session = HibernateUtils.getSession();
		// 2.开启事务
		session.beginTransaction();
		// 3.操作
		Book book = new Book(); // 瞬时态
		//为book的id属性赋值后,执行完此步骤后,book对象将由瞬时态转换为脱管态
		// book.setId(1);
		book.setName("thinking in java");
		book.setPrice(99d);
		session.save(book); // 持久化状态(与Session关联并且有OID值)
		// 4.提交事务
		session.getTransaction().commit();
		// 5.关闭资源
		session.close();
		// 脱管(游离)(依然有OID值,但没有与session关联)
		System.out.println(book); 
		//当程序执行完此处代码后,book对象将由脱管态转换为瞬时态
		// book.setId(null);
	}

session的save()方法:

(1)使一个临时对象转变为持久化对象,

(2)完成以下操作:

          把News对象加入到Session缓存中,使它进入持久化状态
        选用映射文件指定的标识符生成器,为持久化对象分配唯一的OID
(3) Hibernate通过持久化对象的OID来维持它和数据库相关记录的对应关系当News对象处于持久化状态时,不允许程序随意修改它的ID
session的get()和load()方法:

  (1)都可以根据跟定的OID从数据库加载一个持久化对象

  (2)区别:当数据库中不存在与OID对应的记录时,load()方法抛出ObjectNotFoundException异常,而get() 方法返回null

  (3)两者采用不同的延迟检索策略:  load方法支持延迟加载策略。而get不支持。

session的update()方法:

(1)Session的update()方法使一一个游离对象转变 为持久化对象,并且计划执行一条update语句.

(2)必若希望Session仅当修改了News对象的属性时,才执行update() 语句,可以把映射文件中<class>元素的select-before-update设为true.

(3)该属性的默认值为false必当update()方法关联-一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常.

session的saveOrUpdate()方法:

Hibernate持久化对象的状态

session的delete()方法:

    (1)Session的delete() 方法既可以删除-一个游离对象,也可以删除一一个持久化对象
    (2)Session的delete()方法处理过程:
              计划执行一条delete语句
              把对象从Session缓存中删除,该对象进入删除状态.