Hibernate的三种状态为:transient、persistent和detached。对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不在Session中。
另一种说法是,Hibernate有四种状态,增加一个removed状态。在一个session实例的缓存中删除时会转化到该状态。
transient
通过new()创建,不在session的缓存中,也与数据库无关的状态。处在该状态的对象称为临时对象。persistent
对象在session缓存区中,数据库中有数据与之对应。detached
俗称游离状态,即存在于数据库中,但session中已经不存在该对象。
上图是其三种状态之间的转化,下面我们通过实例来具体看一下。
1、开始——>transient
private static SessionFactory factory;
/**
* 完成sessionFactory的初始化
*/
static{
try{
//读取hibernate.cfg.xml配置文件
Configuration cfg=new Configuration().configure();
//建立sessionFactory,可访问mysql
factory=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
//获得session
public static Session getSession(){
return factory.openSession();
}
获取session对象
//获取session对象
session = HibernateUtil.getSession();
// 开启
ts = session.beginTransaction();
// Transient状态
user = new User();
user.setName("张三");
user.setPassword("1233");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
执行new()方法之后,对象进入transient状态。对照上图也可以看出,如果接下来不对其进行操作,该对象最终会被垃圾回收,不再是transient状态。
那么接下来,我们对其执行简单的save()操作。
2、transient——>persistent
// 执行过后,被session管理 Persistent
session.save(user);
//修改用户姓名
user.setName("张四");
//commit会把数据与数据库进行同步。
ts.commit();
3、persistent——>detached
关闭session,对象状态由持久化转为游离态。
if(session!=null){
if(session.isOpen()){
session.close();
}
}
4、detached——>persistent
这里,我们通过update()方法实现。
//再次修改用户名
user.setName("张五");
//获取session对象,与上面类似
session = HibernateUtil.getSession();
// 开启
ts = session.beginTransaction();
// 将session管理
// 变为persistent状态,清理缓存时同步数据库。
session.update(user);
session.getTransaction().commit();
了解Hibernate中对象的三种状态,可以帮助我们对其进行灵活的操作。也可以帮助我们理解他与session缓存、数据库之间的关联。