Hibernate持久化生命周期——三态

通过前几篇博客的大概介绍,我们发现hibernate将业务实体持久化到数据库的工作原理的实现,是通过“映射xml”来衔接的。那么这个xml的由来是哪?

映射文件(hbm)合理的存在的前提就是“有与之对应的实体的存在”——业务实体。

今天这篇博客就来说说实体到数据库的过程,这是一个从代码到数据的持久化过程,就是hibernate实现ORM持久化的生命周期。

一、持久化对象生命周期

下图是hibernate持久化的一个状态图,从图中可以看出,ORM这个过程经历了三个状态:transient,Persistent,Detached。

首先来理解一下 实体对象的三种状态:Transient object ,persist object,detached object包含的信息:

1、Transient Object(临时对象):很明显图中,在起点位置:我们New 了一个对象,进入了Transient 状态。也就是说:使用new 操作符初始化的对象不是立即就持久化的,它们的状态是瞬时的,它们没有任何跟数据库表相关的行为,那么只要程序不再调用这些对象,它们的状态就会丢失,并且由垃圾回收机制回收。

代码示例:

         <span style="font-family:KaiTi_GB2312;font-size:18px;">//创建一个瞬态对象
          User user = new User();
          user.setName(userName);
          user.setPassword("test");
          //user仍是一个瞬态对象</span>

2、Persist Object(持久化对象):持久实例是任何具有数据库标识的实例。它被持久化管理器session统一管理,持久实例是在事务中进行操作的————它们的状态在事务结束时同数据库进行同步,当事务提交时,通过执行SQL的insert,update,和delete语句把内存中的状态同步到数据库中。

代码实例:

                       //创建一个瞬态对象
			User user = new User();
			user.setName(userName);
			user.setPassword("test");
			//user仍是一个瞬态对象

			Session session = sessionFactory.openSession();
			Tansaction tx = session.beginTansaction();
			//此时user仍是一个瞬态对象
			session.save(user);
			//此时user已变为持久态

3、Detached Object(离线对象):session关闭之后,持久化对象就变为离线对象,离线表示这个对象不能再与数据库保持同步,不再受hibernate的管理。

代码示例:

           <span style="font-family:KaiTi_GB2312;font-size:18px;">//创建一个瞬态对象
            User user = new User();
            user.setName(userName);
            user.setPassword("test");
            //user仍是一个瞬态对象

            Session session = sessionFactory.openSession();
            Tansaction tx = session.beginTansaction();
            //此时user仍是一个瞬态对象
            session.save(user);
            //此时user已变为持久态
            tx.commit();
            session.close();     // clear()   evict()  3种变游离态
            user对象已经变成游离态</span>

注意:ORM的过程中,区分三态的标志就是“是否被Session”管理。

Transient ,detached的状态都不被session管理,只有persistent被session管理,注意这里的session是hibernate的session,不是http中用户会话的session。实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象与session对象的实例相关,对这个实体所做的任何变更操作都将被Hibernate持久化到数据库层。

通过这个表格来说明三种状态的区别:

二、hibernate三态之间的相互转换

还是这副图,大家看看图中的箭头,三种状态之间是可以相互转换的。

图中,三态之间的转换有两种

1、进入session,蓝色的箭头,被session管理。

三个口:transient ,detached,transient之前。

操作方法:修改:save ,saveorupdate ,lock;这样不论是在transient,还是detached都可以转换成 persistent状态。

查询:get,load,find,iterator()。

2、出session,红色箭头不被session管理。

一个口:persistent 。

方法:evict,close,clear,delete。

三、persistent 特殊说明

1、直接调用到persistent。

以上说明中,有一个特例就是:查询:get,load,find,iterator()。所以hibernate的三态生命周期不包含查询性质的操作,图中明显可以看到查询语句从是可以从程序中,直接调用到persistent的。查询只跟persistent相关。

从一个实例中来说明:

		Session session = sessionFactory.openSession();
		Tansaction tx = session.beginTansaction();
		User user = (User) session.load(User.class,"key");   ------相当于hql  从DB读出来的 当然是持久态
		//user对象已是持久太对象
		tx.commit();
		session.close();

2、在persistent自动更新

第一点说的是直接调到persistent,这里说的是通过transitent,进入persistent后,进行的自动更新。看代码如下:

		//创建一个瞬态对象
		  User user = new User();
		  user.setName(userName);
		  user.setPassword("test");
		  //user仍是一个瞬态对象

		Session session = sessionFactory.openSession();
		Tansaction tx = session.beginTansaction();
		//此时user仍是一个瞬态对象
		session.save(user);
		//此时user已变为持久态
		tx.commit();

		//persistent自动更新代码

		Tansaction tx2 = session.beginTansaction();
		user.setPassword("pdw");
		tx2.commit();
		//虽然在这个事物中并没有调用session的save()方法来保存user对象,但是usr处于持久太,
		//所以对user对象所做的任何修改都持久化到数据库中   ---------持久态自动更新
		//那么数据库中的密码也变成了pdw
               session.close();

当user进入persistent后,我们可以直接对其进行set操作,因为本来就处在persistent,所以不用通过“save"或者“saveorupdate"来再次进入persistent。这就好比,我们买了游乐园的通票去游玩,只要进去了,就可以玩每个项目,不用每玩一个项目再出去买票了。

这就是操作hibernate对象持久化到数据库的一个流程,三个状态,一个生命周期,状态之间的相互转换,他们都是遵循一定的“事物发展规律”。

本篇博客只是粗显地介绍了基础,是我们开发必须要知道了解的用户手册的一部分。当然还有API,详细的记录了hibernate包含的方法,特性,这里就不在一一介绍,这些仅仅是入门,上手,还是需要多多的练习。

时间: 2024-10-10 08:56:34

Hibernate持久化生命周期——三态的相关文章

hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作

Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generated SQL to the console --> <property name="hibernate.show_sql">true</property> <!-- format SQL in log and console --> <prop

hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据.已经持久化,添?到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Session缓

hibernate 持久化对象的生命周期

包括三种状态:瞬态(自由态),持久态,托管态(游离态) 自由态 持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联. 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中. 游离态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态. session.beginTransaction(); Us

hibernate 持久化对象的生命周期 2.1

持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中 session.save() .....到..session.getTransaction().commit();这个过程 托管态(游离态 提交之后的状态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的

[原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

hibernate session缓存和java对象生命周期

一.java对象生命周期 1.在java中,使用new关键字,创建一个java对象,jvm就为这个对象分配一块内存空间.只要这个变量被引用,他就一直存在于内存中.如果没有被任何变量引用(包括间接引用),那么这个对象就会被垃圾回收器回收.下面用一段代码来解释: Customer c=new Customer(); Order o1=new Order(); Order 02=new Order(); o1.setCustomer(c); c.getOrders().add(o1); o1=null

Hibernate学习之三种状态及生命周期(图)

三种状态: 生命周期: 代码表示: //三种状态     public void testThreeState(){         TUser user=new TUser();         user.setName("spark");  //此时user处于Transient                  try {             Transaction tx=session.beginTransaction();             session.save

持久化API(JPA)系列(五)控制实体Bean的生命周期

上篇文章<持久化API(JPA)系列(四)管理器EntityManager--执行数据库更新>中我们讲解了使用实体管理器的各种函数操作数据库的方法. 本文主要讲:控制实体Bean的生命周期. 与会话Bean类似,实体Bean也有自己的生命周期,分别对应不同的状态. 下面我们首先来讲解实体Bean的状态和生命周期事件: 1.实体Bean生命周期的4种状态 2.实体Bean的事件: @PostLoad @PrePersist和@PostPersist @PreUpdate和@PostUpdate

精通Hibernate——Java对象在JVM中的生命周期

当应用程序通过new语句创建一个对象时,JVM会为这个对象分配一块内存空间,只要这个对象被引用变量引用,他就一直存在在内存当中.当这个对象不被任何对象引用的时候,他的生命周期就意味着结束,JVM会在适当的时候回收这个对象.下面通过代码来演示下生命周期: Customer c = new Customer("Tom",new HashSet()); Order o1 = new Order("Tom_order001",null); Order o2 = new Or