上篇博客介绍了自己对Hibernate三种状态的理解,这一篇主要是通过实例演示去进一步的理解三种状态。
persistent状态:
此时的状态持久化对象纳入的session的管理,当提交事物时,数据会和数据库同步,如果有更新的数据将产生更新语句。
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//transient状态,此时的对象没有纳入session管理
user=new User();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent状态
//persistent状态的对象当对象的属性发生改变的时候
//hibernate清理缓存(脏数据)的时候,会和数据库同步。
session.save(user);
user.setName("李四");
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx!=null) {
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session); //关闭session此时是datached状态
}
产生的SQL语句:
datached状态:
此时的状态不被数据库管理,但是在数据库中存在相应的数据。在此状态下重新拿一个session进行提交会将状态重新变为persistent状态,会将数据在数据库中更新。
try {
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//transient状态
user=new User();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent状态
//persistent状态的对象当对象的属性发生改变的时候
//hibernate清理缓存(脏数据)的时候,会和数据库同步。
session.save(user);
user.setName("李四");
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx!=null) {
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//datached状态,重新拿一个session进行提交。
user.setName("王五");
try {
session=HibernateUtils.getSession();
session.beginTransaction();
//将datached状态的对象重新纳入session的管理
//此时将变为persistent状态对象
session.update(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
产生的SQL语句:
总之,在persistent状态时会将对象纳入到session的管理,无论对象是插入还是更新都会就将最后的数据同步到数据库,并产生相应的sql语句;当关闭session时处于datached状态,此时如果重新开启一个session会将对象重新纳入到session中,当session提交会将数据提交,并产生对应的更新sql语句。