在Hibernate中,持久化对象在操作过程中可以分为三个时期,这三个时期是与Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。所以Session对象的生命周期也关系着持久化对象的生命周期。持久化对象的三种生命周期分别是瞬时态(Transient)、持久态(Persistent)和脱管态(Detached)。
1. 瞬时态
瞬时态的对象时刚刚用new关键字创建出来的,还没有进入Session管理,此时的对象没有和数据库中的记录对应,从未与任何持久化上下文关联过,没有持久化标识(相当于没有主键值)
示例代码如下:
user.setName("JJ");
user.setCity("广州");
session.save(user);//持久化
tx.commit();
此时user就是处于瞬时态的持久化对象。
瞬时态的特征如下:
(1) 在数据库中没有与之匹配的数据。
(2) 没有纳入Session的管理。
2. 持久态
通过Session的save()、persist()或者saveOrUpdate()方法保存处于瞬时态的对象
后,该对象就变为持久态,此时Session中已存在该对象,并且对应数据库中的一条记录。
示例代码如下:
SessionFactory sessionFactory=config.buildSessionfactory();
Session session =sessionFactory.getCurrentSession();
Transaction tx=session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("广州");
session.save(user);//持久化
tx.commit();
在调用save()方法后,持久化对象user就变为持久态,但是执行了commit()方法之后,数据库操作才会执行。Session对象的get()和load()方法也可以返回一个持久态的对象,这个对象代表数据库中的一条记录。
持久态的特征如下:
(1) 对象在数据库中有与之对应的数据
(2) 纳入了Session的管理
(3) 在清理缓存(脏数据检查)的时候,会和数据库同步。即在Session对象失效之前,
对持久态对象的任何修改,在调用Session对象的close()或Transaction对象的commit()方法后,数据库表中对应的数据会同时更新。
3. 脱管态
脱管态,是离开Session管理的状态。处于脱管态的持久化对象的标识符属性和数据库表中某条记录的主键相对应,但他脱离了Session的管理,再次对其操作时,Hibernate无法感知其变化。
示例代码如下:
SessionFactory sessionFactory=config.buildSessionfactory();
Session session =sessionFactory.getCurrentSession();
Transaction tx=session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("广州");
session.save(user);
tx.commit();
user.setCity("汕头");
虽然后来又修改了user对象的city属性,但是在脱管态修改的,程序结束也不能在影响数据库中数据的变化。处于脱管态的对象可以重新调用Session对象的update()方法回到持久态,否则Java虚拟机会在适当的时机进行垃圾回收。
重新回到持久态的实例代码如下:
SessionFactory sessionFactory=config.buildSessionfactory();
Session session =sessionFactory.getCurrentSession();
Transaction tx=session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("广州");
session.save(user);
tx.commit();
user.setCity("汕头");
session=sessionFactory.getCurrentSession();
tx=session.beginTransaction();
session.update(user)//重新持久化
tx.commit();
脱管态的特征如下:
(1) 在数据库中有与之匹配的数据
(2) 没有纳入Session的管理
4. 三种状态转换的演示实例
如果一个对象被创建出来的时候处于瞬时态,此时调用save()或update()方法可以
将对象变为持久态,处于持久态的对象调用close、clear、evict()方法可以转换为脱管态,具体的装换过程如图:
end:最后贴上一段Hibernate操作数据库的简单代码
public class Client{
public static void main(String[] args){
//读取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
//创建SessionFactory
SessionFactory factory=cfg.buildSessionfactory();
Session session=null;
try{
session=factory.openSession();
//开启事务
session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("广州");
//保存数据
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session!=null){
if(session.isOpen()){
//关闭session
session.close();
}
}
}
}
}