Hibernate三种状态的转换示例

介绍

小编给大家分享一下冬眠三种状态的转换示例,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

<节> <节>


<强>一、遇到的神奇的事情

使用jpa操作数据库,当我使用findAll()方法查处一个列表的对象后,给对这个列表的实体进行了一些操作,并没有调用更新或者saveOrUpdate方法,更改后的数据却神奇的保存到数据库里面去了。

最后简单粗暴的解决办法是把这份从数据里面查出来的名单复制了一份,然后再操作,再返回。数据就正常了,数据库也没更新。后面找了资料才发现是jpa是对Hibernate的封装,底层是冬眠,这是Hibernate的持久状态搞的鬼。

<强>二,Hibernate的三种状态

<强> 1。瞬时状态(瞬态)

当我们通过Java的新关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:

客户客户=新客户(“zx”, 27岁的图像),

这时客户对象就处于自由状态,为什么说客户对象处于自由状态呢?这是因为,此客户时只是通过JVM获得了一块内存空间,还并没有通过会话对象的保存()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说客户对象现在还自由的游荡于Hibernate缓存管理之外,所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。

<>强瞬时对象特点:

<李>

不会话和实例关联

<李>

在数据库中没有和瞬时对象关联的记录

<强> 2。持久状态(持续)

持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:

客户客户=新客户(“zx”, 27岁的图像),

tx=session.beginTransaction ();

session.save(客户),

客户=(客户)session.load (Customer.class,“1”);

customer.setAge (28);

tx.commit ();

这时我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时客户对象通过保存方法保存进数据库后,已经是持久化对象了,然后通过负载方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。

持久的实例在数据库中有对应的记录,并拥有一个持久化标识(标识符)。

持久对象总是与会话和事务相关联,在一个会话中,对持久对象的改变不会马上对数据库进行变更,而必须在交易终止,也就是执行提交()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏(脏)对象。

<>强瞬时对象转为持久对象:

<李>

通过会话的保存()和saveOrUpdate()方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。


<李>

使用细(),(),()加载和迭代()待方法查询到的数据对象,将成为持久化对象。

<>强持久化对象的特点:

<李>

和会话实例关联

<李>

在数据库中有和持久对象关联的记录

<强> 3。脱管状态 (Detached)

当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:

Customer customer=new Customer(“zx”,27,images);

tx=session.beginTransaction();

session.save(customer);

customer=(Customer)session.load(Customer.class,”1”);

customer.setAge(28);

tx.commit();

session.close();

当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与customer对象对应的数据记录,所以此时customer对象处于游离态;

与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。

脱管对象特点: