有关hibernate的状态周期理解

1.状态周期
①瞬时状态对象(Transient Objects)
使用new操作符初始化的对象不是立刻就持久的.它们的状态时瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所应用),它们的状态将会丢失,并有垃圾回收机制回收
②持久化状态对象(Persist Objects)
持久实例是任何具有数据库标识的实例.它由持久化管理器Session统一管理,持久实例是在事务中进行操作的--它们的状态在事务结束时同数据库进行同步.
③离线状态对象(Detached Objects)
Session关闭之后,持久化对象就变为离线对象.离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理

Transient对象与Detached对象:
相同点:都不被session管理
不同点:Transient对象,数据库没有与之对应的记录;Detached对象,数据库有与之对应的记录


//测试方法(瞬时到持久化)
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("123");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//persistent(持久化)状态
session.save(user);

/*
* 由于目前处于persistent状态
* 当对象的属性发生改变的时候
* hibernate会自动和数据保持同步
* 也就是说,数据库保存的是"456"
*/
user.setName("456");

tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
在控制台可以看到打印的sql语句:
Hibernate: insert into t_user 
(name, password, createTime, expireTime, id) 
values (?, ?, ?, ?, ?)

Hibernate: update t_user set name=?, 
password=?, createTime=?, expireTime=? 
where id=?
先insert,后面因为属性改变,所以又update
---

public class SessionTest extends TestCase {
//测试方法(瞬时到持久化到离线)
public void testSave2(){
Session session = null;
Transaction tx = null;
User user = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

//Transient(瞬时)状态
user = new User();
user.setName("123");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//persistent(持久化)状态
session.save(user);

/*
* 由于目前处于persistent状态
* 当对象的属性发生改变的时候
* hibernate会自动和数据保持同步
* 也就是说,数据库保存的是"456"
*/
user.setName("456");

tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached(离线)状态
user.setName("789");
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

//回到persistent(持久化)状态
session.update(user);

tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
你可以再控制台看到sql语句:
Hibernate: insert into t_user (name, password, createTime, expireTime, id) 
values (?, ?, ?, ?, ?)
Hibernate: update t_user set name=?, password=?, createTime=?, expireTime=? where id=?
Hibernate: update t_user set name=?, password=?, createTime=?, expireTime=? where id=?
先insert,后面因为属性改变,所以又update,再后来,从离线状态回到持久化状态,并且属性改变,再次update

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值