Hibernate的三种状态
初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态)。
它们之间有如下转换图来说明:
1、transient(瞬时状态)。
如上图所示,当new出来一个新对象,还没有保存到数据库中的时候,就是transient状态。
代码表示如下:
1 session=HibernateUtils.getSession(); 2 tx=session.beginTransaction(); 3 //Transient状态 4 User user=new User(); 5 user.setName("Jessica"); 6 user.setPassword("123"); 7 user.setCreateTime(new Date()); 8 user.setExpireTime(new Date()); 9 //********************************************************************** 10 /* 11 * 以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的 12 * 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象 13 * user就变成了一个Persistent(持久化对象) 14 */ 15 //***********************************************************************
2、persistent(持久化状态)。
当临时状态的对象被执行save之后,就会被session托管,在session中有一个map存放着user对象,也就是说user对象被session引用着,被session纳入管理了。此时的user就处于持久状态了。
1 session=HibernateUtils.getSession(); 2 tx=session.beginTransaction(); 3 //Transient状态 4 User user=new User(); 5 user.setName("Jessica"); 6 user.setPassword("123"); 7 user.setCreateTime(new Date()); 8 user.setExpireTime(new Date()); 9 //********************************************************************** 10 /* 11 * 以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的 12 * 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象 13 * user就变成了一个Persistent(持久化对象) 14 */ 15 //*********************************************************************** 16 //Persistent状态 17 session.save(user);
3、detached(游离状态)。
当持久状态的对象user,在session关闭之后就会变成有游离状态。
1 Session session=null; 2 Transaction tx=null; 3 4 try { 5 session=HibernateUtils.getSession(); 6 tx=session.beginTransaction(); 7 //Transient状态 8 User user=new User(); 9 user.setName("Jessica"); 10 user.setPassword("123"); 11 user.setCreateTime(new Date()); 12 user.setExpireTime(new Date()); 13 //********************************************************************** 14 /* 15 * 以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的 16 * 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象 17 * user就变成了一个Persistent(持久化对象) 18 */ 19 //*********************************************************************** 20 //Persistent状态 21 session.save(user); 22 23 //进行修改操作,修改name=“Juyahong” 24 user.setName("Juyahong"); 25 //提交事务 26 tx.commit(); 27 28 } catch (Exception e) { 29 e.printStackTrace(); 30 if (tx != null) { 31 tx.rollback(); 32 } 33 } finally{ 34 35 HibernateUtils.closeSession(session); 36 } 37 38 //detached状态
通过以上例子,可以基本理解了Hibernate的三种状态,其实可以举个例子来说明:我们把数据库比喻成一个登记簿,当我们把信息登记到登记簿上的时候,这个过程就是持久化的过程。当登记完成之后,登记簿上的数据就是持久态数据,所谓持久态就是一直存在的状态。当我们需要用数据的时候,会从登记簿上查信息,我们查到的信息记录在临时的纸张或者脑海里,然后登记簿会放回原位,这时候临时纸张上或者脑海里的数据就是游离态,随时可能被遗忘,在hibernate中就是随时会被销毁的数据。瞬态数据和游离态数据有点儿类似,但是一点,就是他是存在持久化之前的数据,就是说我需要登记个人信息,我的个人信息还没有登记到登记簿上的时候,信息就是瞬态,一旦登记到登记簿上就变成持久态了,然后再查询到的就是游离态。