zoukankan      html  css  js  c++  java
  • [置顶] 【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>



    总结:
    这三种状态主要是看他们在数据库和session中是否存在:

    Transient
       *没有被session管理
       *在数据库中没有与之匹配的记录
    Persist
       *纳入session管理
       *在数据库中有与之匹配的记录
       *当属性发生改变,在清理缓存时(脏数据检查)会自动和数据库同步
    Detached
       *没有被session管理
       *在数据库中存在与之匹配的记录

  • 相关阅读:
    Python第二弹--------类和对象
    Python第一弹--------初步了解Python
    Java标记接口
    CentOS7下的YUM源服务器搭建详解,过程写的很详细(转)
    CentOS7.0安装Nginx 1.10.0
    QT中C++与Html端通信例子
    QT基础:QMainWindow学习小结
    QT基础:QT 定时器学习
    QT3D场景快速绘制入门学习
    QT编译错误:cannot find file: *.pro
  • 原文地址:https://www.cnblogs.com/chenxiaochan/p/7237577.html
Copyright © 2011-2022 走看看