在Hibernate中,对象有三种状态:临时状态、持久状态和游离状态。
临时状态:当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象。
例如:Emp e=new Emp(); //创建临时对象
e.setEmpno((long) 8888);
e.setEName("mike");
...
EmpDAO d=new EmpDAO();
d.save(e);//持久化
...
持久状态: 持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对象进行delete操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象变成临时状态。
持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的(Dirty)。
例如:
Emp e=new Emp(); //创建了临时的对象
EmpDAO edao= new empDAO();
e=edao.findbyEmpno((long) 7786); //使对象与数据库记录对应,从而持久化
e.setEname("新的名字"); //修改了持久化对象,使之处于 Dirty
......
edao.saveorupdate(e); //保存,但是仍然 Dirty
tran.commit(); //提交,实现与数据库同步,不再Dirty
......
游离状态:当Session进行了Close、Clear或者evict后,持久化对象虽然拥有持久化标识符和与数据库对应记录一致的值,但是因为会话已经消失,对象不在持久化管理之内,所以处于游离状态(也叫:脱管状态)。游离状态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。
其中,持久化状态的对象,简称为:PO
而临时状态和游离状态的对象,简称为:VO
1、通过get()或load()方法得到的实例都是持久化状态的。
2、当把session关闭时,session缓存中的持久化对象也变成游离态
因关闭session而变成游离态的可以通过lock、save、update变成持久态
3、持久态实例可以通过调用delete()变成游离态
而游离状态的实例可以通过调用lock()或者replicate()进行持久化
4、save()和persist()将会引发SQL的insert,delete()会引发SQL的delete
update()或merge()会引发SQL的update,对持久化实例的修改在刷新提交的时候会
被检测到, 它会引发SQL的update
saveOrUpdate()或者replicate ()会引发SQL的insert或者update
posted on 2010-08-16 09:59
David1228 阅读(322)
评论(0) 编辑 收藏 所属分类:
Hibernate/ibatis