【Hibernate步步为营】--核心对象+持久对象全析(二)
上篇文章讨论了Hibernate的核心对象,在开发过程中经常用到的有JTA、SessionFactory、Session、JDBC,其中SessionFactory可以看做数据库的镜像,使用它能够创建Session对象,JTA用来管理事务,在对象模型修改后同步到数据库中,另外还有Hibernate作为持久层它封装了持久层的转化过程,下面着重讨论持久对象的转换过程。
一、状态解析
1、Transient:数据库中没有,没有被Session管理
从Hibernate的体系结构图中不难看出,对象的瞬态是在应用程序中完成的,当对象被创建后即转变为瞬态,它还没有持久化的过程,也就是说并没有持久化标示(id号,Hibernate在创建持久化对象时都会为该对象指定一个id标示,保证唯一性)。瞬态的对象如果没有任何的操作的话,会在某一时刻消亡,并被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状态 }
在save方法处设置断点,运行调试,输出结果如下图:
2、Persistent:数据库中有,被session管理
一个瞬态的对象操作完成后需要保存操作,这时候调用save或者其他保存方法时即被转换为持久对象,这时候Hibernate给该对象创建一个持久化标示,并且可能在数据库中有了一个对应行,而且该标示与Java标示(该值表示对象在内存的位置)等价。
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); }
}
调用save方法后进入的持久态,此时的为user对象添加了id标识:
数据库中添加的最后信息是lisi,所以它最后执行了更新操作,此时在控制台中会打印两条sql语句,分别为insert和update语句。
Note:在提交事务或者关闭Session前,会调用Session的flush方法对每个更改进行操作。
3、Detached:数据库中有,没有被session管理
脱管状态下的对象其实已经被映射到了数据库中,只不过此时还没有被垃圾回收期回收,此时的对象拥有持久化标识,该标识对应着数据库中的一行,但是不保证该标识与Java标识对应。
在SessionTest类中添加testSave3方法,测试Detached状态下对象和数据库,代码如下:
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); } }
执行完成后,查看数据库中信息,如下图:
结语
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。