您的位置:首页 > 其它

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

2017-02-17 20:50 253 查看

引言

         上一篇博客中小编做了关于hibernate的小Demo,下面我们将深入研究hibernate持久化对象的三种状态。

Hibernate持久化对象的三种状态

         大家知道,java对象的生命周期,就是从new开始,到不再被任何引用变量引用结束,结束后将会被JVM的垃圾回收机制收回。在hibernate中,持久化的对象可以划分为三种状态:持久态(Persistent)、瞬时态(Transient)、脱管态(Detached)

一、  持久态(Persistent)

       1)   在session的缓存中,与session实例相关联

       2)   在数据库中存在与之相对应的记录

二、  瞬时态(Transient)

       1)不在session的缓存中红,不与任何的session实例相关联

       2)在数据库中没有与之相对应的记录

三、  脱管态(Detached)

      1)不在session的缓存中,不与任何的session实例相关联

      2) 在数据库中存在与之相对应的记录(前提条件是没有其他session实例删除该条记录)

       这三种状态是可以相互转化,具体过程如下:



 

Transient

新new出来的对象,就是瞬时对象。在内存中孤立存在,它的意义是携带信息的载体,不和数据库的数据又任何关联。

public void testSave1(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//Transient状态
User3 user = new User3();
user.setName("邢玉1");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());


 

Persistent

        通过session的save()或update()方法可以把一个瞬时对象与数据库相关联,并把瞬时对象携带的信息通过配置文件所做的映射插入到数据库中,这个瞬时对象就转换成了持久对象。

 

//persistent状态
//persistent状态的对象,当对象的属性发生改变的时候,
//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
session.save(user);
user.setName("邢玉2");

tx.commit();


 

Detached

         当一个session指定close()或clear,evict()之后,持久对象就变成了脱管对象。这时对象的id虽然拥有数据库识别值,但他们目前并不在Hibernate持久层的管理下,它与瞬时对象的本质是相同的,只不过比瞬时对象多了数据标识的id值。脱管对象的引用依然有效,对象可以继续被修改,当它重新被关联到某个新的Session上时,会再次变成持久对象(脱管状态期间的改动将被持久化到数据库上)。

}catch(Exception e)
{
e.printStackTrace();
if(tx!= null){
tx.rollback();
}

}finally{
HibernateUtils.closeSession(session);
}
//detached状态
}


            三段代码连接来,就是持久化对象三种状态的转换过程。

总结

  hibernate的学习还在路上,小编仍需继续努力!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: