Hibernate持久化对象状态

在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关.

分别是瞬时(Transient),持久太(persistent)和游离态(Detached)

瞬时状态

由new命令开辟内存的java对象.例如:Student
stu= newStudent();若没有变量对他引用,则被jvm回收.瞬时对象在内存中孤立存在,他的意义仅是携带信息的载体,不和数据库中的数据有任何的关联。通过session的save()和saveOrUpdate()方法可以把一个瞬时对象与数据库相关联,并把瞬时对象携带的信息通过配置文件所做的映射插入到数据库中,这个瞬时对象就成了持久化对象,拥有和数据库记录相同的id标示(Hibernate自动将id赋予它)

瞬时特点:

(1)不和Session实例关联

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

持久态

持久的实例在数据库中有对应的记录.是Session
和Transction相关联.在sessin中,持久对象改变不会马上对数据变更.而必须在Transcation终止,commit后,才与数据库进行同步.在此之前的持久太对象为脏对象.

使用 find,get ,load
和iterater等方法查询的数据,都是持久对象.
若一个瞬时对象被持久对象引用,则该对象也会变为持久对象.

如果使用delete()方法,它就会变为瞬时对象;当一个Session执行close()或clear()、evict()之后,持久对象就会变为托管对象。

持久特点:

(1)和Session实例关联

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

	代码示例:
	public void testSave()
		{
			Session session =null;
			Transaction tx=null ;
			try{
				session= HibernateUtils.getSesion();
				 tx =session.beginTransaction();

				//transient 瞬时状态
				User user= new User();
				user.setName("sdf");
				user.setPassword("hanhan23");
				user.setCreateTime(new Date());
				//persistent, ,session引用,po持久
				session.save(user); //被引用,成为持久状态//但是为脏对象
				user.setName("lisd");
				tx.commit();//
			}catch(Exception e){
				e.printStackTrace();
				tx.rollback();
			}finally{
				HibernateUtils.closeSession(session);
			}
			//deteached状态关闭sesion后
		}

以上示例演示瞬时态转为持久态对象

托管状态

与持久对象关联的Session被关闭后,对象变为托管。对托管对象的引用依然有效,对象可继续被修改。托管对象如果重新关联到某个新的Session上,会再次转变为持久的。托管状态期间的改动将会被持久化到数据库。

托管状态拥有数据库标识id,所以它可以通过update()、saveOrUpdate()和lock()等方法,再度与持久层关联。

托管特点:

(1)本质上和瞬时对象相同

(2)只是比瞬时对象多了一个数据库记录标识值id

小结:

通过以上三种的对比,认识到,Hibernate中的对象是在session的管理进行数据的持久更新.状态之间的转换是与对象的生命周期息息相关.
刚创建的内存中为游离态,若一旦被session保存为持久态(或被session引用).一旦sesion关闭或delete变为托管.学习之初,还请多多提意见.

时间: 2024-10-12 21:29:24

Hibernate持久化对象状态的相关文章

Hibernate持久化对象状态、转换方法和操作步骤

1  持久化对象三种状态 瞬态:对象由new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态.瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识.如果程序中失去了瞬态对像的引用,瞬态对象将被垃圾回收机制销毁.使用Hibernate Session可以将其变为持久化状态. 持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(identifier).持久化的实例可以是刚刚保存的,也可以是刚被加载的.无论哪一种,持久化对象都必须与制定的Hibernate

Hibernate 持久化对象状态

持久化对象PO类状态 1.状态分类    transient  瞬时态:hibernate的session缓存中没有存放,数据库中没有数据.例如新建的po类,没有OID值 persistent  持久态:hibernate的session缓存中存放,数据库中最终会有.例如save(po) 完成commit操作,有OID值 detached   脱管态:hibernate的session缓存中没有,数据库中有数据.脱离session的管理,有OID值  2.OID OID:hibernate用于标

Hibernate持久化对象的三种状态

在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的.Session的特定方法能使对象从一个状态转换到另一个状态. 持久化对象的生命周期有三种,瞬时状态.持久状态和分离状态.如下图: 瞬时态 不曾进行持久化,未与任何Session相关联.此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应. //Transient状态 Useruser = new User();

【hibernate进阶】hibernate持久化对象的三种状态

Hibernate持久化对象的三种状态:瞬时对象(Transient Objects),持久化对象(Persist Objects),离线对象(Detached Objects). 三种状态:    瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不在引用这些对象(不再被任何其他对象所引用),它们的状态将会丢失,并由垃圾回收机制回收. 持久化对象(Persist Objects

hibernate 持久化对象的生命周期

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

Hibernate持久化对象

持久化类应遵循的规则: 有无参构造器,构造器的修饰符>=默认访问控制符 有标识属性,映射数据库表的主键,建议使用基本类型的包装类 每个成员有setter和getter 非final修饰的类 重写equals()和hashCode()方法(当需要把持久化类的属性放进Set中时) 持久化类的状态: 改变持久化对象状态的方法: 持久化实体: Serializable save(Object obj)   保存到数据库 void persist(Object obj) Serializable save

Hibernate持久化对象的状态

1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 . 2. 暂时状态(Transient) : 1). 在使用代理主键的情况下 , OID 通常为 null 2). 不处于 Session 的缓存中 3). 在数据库中没有相应的记录 3. 持久化状态(也叫"托管" )( Persist) 1). OID 不为 null 2). 位于 S

hibernate持久化对象三种状态及其转换

持久化类类三种状态介绍1. 瞬时态:也叫做临时态或自由态,它一般指我们 new 出来的对象,它不存在 OID, 与 hibernate session 无关联,在数据库中也无记录.它使用完成后,会被 jvm 直接 回收掉,它只是用于信息携带.简单说:无 OID 与数据库中的信息无关联,不在 session 管理范围内.2. 持久态:在 hibernate session 管理范围内,它具有持久化标识 OID 它的特点,在事 务未提交前一直是持久态,当它发生改变时, hibernate 是可以检测

Hibernate 持久化对象的状态

持久化对象有3种状态:1.持久化状态      2.临时状态      3.游离状态 Session 的特定方法能使对象从一个状态转换到另一个状态临时对象(transient)•    在使用代理主键的情况下, OID 通常为 null•    不处于 Session 的缓存中•    在数据库中没有对应的记录 持久化对象(也叫”托管”)(Persist)•    OID 不为 null•    位于 Session 缓存中•    持久化对象和数据库中的相关记录对应•    Session 在