上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA、SessionFactory、Session、JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以创建Session对象。JTA用来管理事务,在对象模型改动后同步到数据库中。另外还有Hibernate作为持久层它封装了持久层的转化过程。以下着重讨论持久对象的转换过程。
瞬态的对象假设没有不论什么的操作的话。会在某一时刻消亡,并被Java的垃圾回收器回收。
事例演示:在SessionTest中加入一个名为testSave1的方法,代码例如以下:
public void testSave1(){
Session session=null;
Transaction tx = null;
try{
session=HibernateUtils.getSession();
//开启事务
tx= session.beginTransaction();
//Transient状态
User user=new User();
user.setName("zhangsi");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
}catch(Exception e){
e.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//detached状态
}
persistent状态的对象若发生了改变。则在清理内存时或者在脏数据检查时会把改变同步到数据库中。那么此时会生成两条语句,分别为insert和update。
在SessionTest中加入saveTest2方法。測试持久态
public void testSave2(){
Session session=null;
Transaction tx = null;
try{
session=HibernateUtils.getSession();
//开启事务
tx= session.beginTransaction();
//Transient状态
User user=new User();
user.setName("zhangsi");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent状态
//persistent状态的对象,当对象的属性发生改变的时候
//Hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
session.save(user);
user.setName("lisi");
//能够显示的调用udpdate方法,由于此时为持久状态。调用udpate没有什么意义
session.update(user);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
}
Note:在提交事务或者关闭Session前。会调用Session的flush方法对每一个更改进行操作。
public void testSave3(){
Session session=null;
Transaction tx = null;
User user=null;
try{
session=HibernateUtils.getSession();
//开启事务
tx= session.beginTransaction();
//Transient状态
user=new User();
user.setName("zhangsi");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent状态
//persistent状态的对象。当对象的属性发生改变的时候
//Hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
session.save(user);
user.setName("lisi");
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//detached状态
user.setName("wangwu");
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//将detached状态的对象又一次纳入session管理
//此时将变为persistent状态的对象
//persistent状态的对象,在清理缓存时会和数据库同步
session.update(user);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
【Hibernate步步为营】--核心对象+持久对象全析(二)
原文:http://www.cnblogs.com/liguangsunls/p/6696540.html