Hibernate旅程(三)Hibernate持久化对象的三个状态(二)

2014-11-24 02:40:41 · 作者: · 浏览: 5
//进行保存.执行save则对session进行管理了. 处于持久状态. //persistent状态的对象.当对象的属性发生改变的时候,hibernate在清理 //缓存的时候(脏数据检查)的时候,会和数据库同步. session.save(user); user.setName("李四"); //再次提交. tx.commit(); }catch(Exception e) { e.printStackTrace(); if(tx!=null) { // 事务回滚. tx.rollback(); } }finally { //关闭session.当关闭session时处于Detached状态. HibernateUtils.closeSession(session); } }



首先是建立对象与表的会话session,开启事务session.beginTransaction(),实例化User对象,当我们User user = new User()的时候,当我们new一个对象的时候数据库是没有的,所以是Transient对象(临时对象),然后给user赋值,设置名称和密码以及其他属性。 为对象的所有属性赋值完毕,接下来保存到会话session中,拿到session执行save(user)方法。 当我们执行session的save()方法时,这个对象就被session管理了,session中有个map,会把对象放到map中,此时的对象我们就成为persistent状态(持久状态)。


接下来我们又把user中的name属性设置为“李四”,之后提交事务。我们先再会话中存储的“张三”,之后改为“李四”。try catch来扑捉异常,当执行完毕,关闭session后,对象处于detached状态(离线状态)。


我们创建数据库,利用ExportDB.java方法建立表。之后执行SessionTest的testSave1()方法,当执行到session方法的时候,表中自动生成user表的id值,并且名子为“张三”,之后再次执行,名字又变为“李四”,之后执行事务的commit()方法tx .commit ,此时控制台才发出语句,如下图3.2。

\


从控制台的语句中可以看出,显示发送的插入sql语句,后是update语句,首先是持久化对象user中的名字为“张三”,所以save的时候生成inset语句。此时user处于持久状态的对象,我们之后又给变了持久化对象,所以发送了一个修改语句。也就是当持久化对象发生修改时,我们再提交事务,就会把修改的全部体现出来(update语句)。

也就是我们再提交事务的时候,在清理缓存,也就是脏数据检查(内存中变了,而数据没变),要检查哪些数据是有问题的,要保持内存和数据库的同步。所以我们数据库中添加的记录,user的名字为李四(如图3.3所示)。

\

图3.3

如果上述代码中,我们在修改名字为李四后user.setName("李四");我们显示调用session的update()方法,session.update(),运行,会看到控制台上打印的sql语句和我们不加如session.update()打印的相同。持久化对象只要更改了,在提交事务的时候就会同步,没有必要再显示调用。

Detached状态演示

我们在执行完所有的操作,关闭session后,此时的user对象变为detached状态,此时进行操作。

代码如下所示。

	public void testSave3()
				{
					Session session = null;
					Transaction tx = null;
					
					User user = null;
					try
					{
						//取得session.
						session = HibernateUtils.getSession();
						//自己开启事务. fanhui transient的一个实例.
						 tx = session.beginTransaction();
						
						//传入值.变为Transient状态.
						user = new User();
						user.setName("张三");
						user.setPassword("123");
						user.setCreateTime(new Date());
						user.setExpireTime(new Date());
									
						//进行保存.执行save则对session进行管理了. 处于持久状态.
						//persistent状态的对象.当对象的属性发生改变的时候,hibernate在清理
						//缓存的时候(脏数据检查)的时候,会和数据库同步.
						session.save(user);
						
						user.setName("李四");
						//可以显示的调用update方法,因为此时为持久状态,调用update没有什么意义.
						//再次提交.
						tx.commit();
					}catch(Exception e)
					{
						e.printStackTrace();
						if(tx!=null)
						{
							// 事务回滚.
							tx.rollback();
						}
					}finally
					{
						//关闭session.当关闭session时处于Detached状态.
						HibernateUtils.closeSession(session);
					}
					
					//已经不能用以前的session了.
					user.setName("王五");
					try
					{
						//得到新的session.
						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.closeSe