hibernate对象的三种状态是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate对象的三种状态是啥?相关的知识,希望对你有一定的参考价值。

(1)瞬态:表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联即,该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有:
               与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。
(2)持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对象的实例相关的。处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate持久化到数据库中。处于持久态的对象具有的特征为:              
  每个持久态对象都于一个Session对象关联
               处于持久态的对象是于数据库中的记录相关联的
               Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录
(3)游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。。游离态对象的特征有:
                游离态对象一定是由持久态对象转换而来
                游离态实体不再于Session关联
              游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据
               游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
参考技术A 临时状态(新建状态):刚用new语句创建,还没被实例化,并且不处于session的缓存中,处于临时状态的java对象被称为临时对象.
持久化状态:被加入到数据库中,也被加入到session缓存中,处于持久化的java对象被称为持久化对象.
游离状态:已经被持久化,但是不存在session缓存中,处于游离的java对象被称为游离对象.
删除状态:不处于数据库,更不处于session缓存中.
参考技术B 有三个状态:瞬时、持久、托管
其中用set为瞬时态,save后为持久态,当session关闭后变为游离态
参考技术C 瞬时态,持久态,脱管态

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

Hibernate持久化对象的三种状态:瞬时对象(Transient Objects),持久化对象(Persist Objects),离线对象(Detached Objects)。


三种状态:

   瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不在引用这些对象(不再被任何其他对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。
   持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例。它有持久化管理器session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT,UPDATE和DELETE语句把内存中的状态同步到数据库中。

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


状态转换:

持久化对象的三种状态是可以相互转化的,具体转换过程如图所示:






实例讲解:

TO→PO:

<strong><span style="font-size:18px;"><strong><span style="font-size:18px;">public void testSave1() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//Transient状态
			User user = new User();
			user.setName("zhangsan");
			user.setPassword("123");
			Date date=new Date();                               
                        SimpleDateFormat temp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");    
                        String date2=temp.format(date);    
                        Date date3=temp.parse(date2);    
               
              
                        user.setCreateTime(date3);  
                        user.setExpireTime(date3); 
			
			//Persistent状态
			//Persistent状态的对象,当对象的属性发生改变的时候
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			session.save(user);
			
			user.setName("lisi");
			
			tx.commit();
			
		}catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}finally {
			HibernateUtils.closeSession(session);
		}
		//detached状态
	}</span></strong></span></strong>

输出的结果:

<strong><span style="font-size:18px;"><strong><span style="font-size:18px;">Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?</span></strong></span></strong>

TO→PO→DO→PO:

<strong><span style="font-size:18px;">	<strong><span style="font-size:18px;">public void testSave3() {
		Session session = null;
		Transaction tx = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//Transient状态
			user = new User();
			user.setName("张三");
			user.setPassword("123");
			Date date=new Date();                               
            SimpleDateFormat temp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");    
             String date2=temp.format(date);    
             Date date3=temp.parse(date2);    
               
              
             user.setCreateTime(date3);  
            user.setExpireTime(date3); 
			
			//Persistent状态
			//Persistent状态的对象,当对象的属性发生改变的时候
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			session.save(user);
			
			user.setName("lisi");
			
			tx.commit();
			
		}catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}finally {
			HibernateUtils.closeSession(session);
		}
		//detached状态
		user.setName("wangwu");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//将detached状态的对象重新纳入session管理
			//此时将变为persistent状态的对象
			//persistent状态的对象,在清理缓存是会和数据库同步
			session.update(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	</span></strong></span></strong>


输出的结果:

<strong><span style="font-size:18px;"><span style="font-size:18px;"><strong>Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?</strong></span></span></strong>