持久对象的生命周期介绍


Transient对象:随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,
就变为Persistent对象(持久性对象),没有纳入session的管理
Persistent对象:在数据库有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步。
Detached对象:也可能被垃圾回收器回收掉(数据库中存在对应的记录,只是没有任何对象引用它是指session引用),注
引状态经过Persistent状态,没有纳入session的管理


Junit简介:
编写测试类xxxTest,需要继承TestCase;
编写单元测试方法,测试方法必须以test开关,测试方法不能含有参数和返回值,如:
Public void testHello1(){}
最好单元测试的代码单独建立一个目录。


赃数据检查(版本比较):

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();
tx.rollback();
} finally {
HibernateUtils.closeSession(session);
}

session现在插入一条数据:User 对象name: 李四,现在需要修改数据,修改数据时采用数据版本的比较,修改之
前对现有数据记录照一个快照(这个快照为最新数据“name:李四”),现在要User对象的name更改为五王(name:
五王),当session提交事务之前时commit(),需要清理缓存(也称为賍数据对比),查看哪些数据需要发innert 的
SQL语句,而哪些需要发update语句。此处发出两条(第一条:为innert语句添加;第二条:在賍数据对比时发现
数据发生改变,就发出update语句


Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?,
?, ?, ?)
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?


public void testSave1(){
	Session session = null;
	Transaction tx = null;
	User user = null;
	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("王五");
		//实际上user.setName("王五")此时已经发出一条update指令了。
		//也可以显示的调用update指定
		//session.update(user);
		tx.commit();
		
	
	} catch (Exception e) {
		e.printStackTrace();
		tx.rollback();
	} finally {
		HibernateUtils.closeSession(session);
	}
	/*
	 * 从此处开始session已经在上面关闭,这时user对象状态就变为detached状态,
	 * 所有user对象已经不被session管理,但数据库中确实存在与至对应的记录(王五)。
	 */
	//detached状态
	user.setName("张三");
	try {
		session = HibernateUtils.getSession();
		session.beginTransaction();
		/*
		 * 此时session又对user对象进行管理
		 * 当session发出update指定后,进行更新数据为(张三。)
		 */
		session.update(user);
		//update后user对象状态又变为persistent状态
		session.getTransaction().commit();
		/*
		 * 此时session提交事务,发出update语句
		 * Hibernate: update User set name=?, password=?, createTime=?, 
		expireTime=? where id=?
		 */
	} catch (HibernateException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		session.getTransaction().rollback();
	}finally {
		HibernateUtils.closeSession(session);
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值