8.2 实体对象的生命周期
8.2.1 实体对象的3种状态
(1)自由状态Transient
自由状态转持久状态session.save
结论:处于自由状态的实体对象,可以通过Session.save方法转换成持久状态。
如果一个实体对象是由hibernate加载(如通过Session.load方法获得),那么,它也处于持久状态。
(2)持久状态Persistent
持久状态的对象对应了数据库中的一条记录,可以看作是数据库记录的对象化操作接口,其状态的变更将对数据库中的记录产生影响。
(3)游离状态Detached
持久状态转游离状态:session.close
处于持久状态的对象,其对应的Session实例关闭之后,那么,此对象就处于游离状态。
自由状态与游离状态的区别
自由状态中的实体对象,无主键信息,而游离状态的实体对象,包含了其对应的数据库记录的主键值。
自由状态的对象与库表中的记录无关,我们无法根据自由状态对象中的信息在库表中找寻到对应的记录,而游离状态的对象,虽然与Session实例脱离,但我们根据其中的信息,能够寻找到库表中对应的数据记录。
持久状态转自由状态:session.delete
实体对象从持久状态转变为自由状态,一般由session.delete方法完成。
//实体对象的三种状态
public static void main(String[] args) {
Session session=HibernateSessionFactory.getSession();
Dept d=new Dept();
d.setDeptno((byte)14);
d.setDname("劳动部");
d.setLoc("山东青岛");//此时d处于自由状态
Transaction tran=session.beginTransaction();
session.save(d);
tran.commit();//此时d处于持久状态
session.close();//此时的d处于游离状态
Session session2=HibernateSessionFactory.getSession();
Transaction tran2=session2.beginTransaction();
session2.update(d);//对象d由游离状态转为持久状态
d.setDeptno((byte)14);
d.setDname("技术部");
d.setLoc("山东临沂");//由于d对象处于持久状态,因此属性变更将自动由Hibernate固化到数据库
tran2.commit();
}
}
执行结果:
Hibernate: insert into SCOTT.DEPT (DNAME, LOC,DEPTNO) values (?, ?, ?)
Hibernate: update SCOTT.DEPT set DNAME=?, LOC=?where DEPTNO=?
public staticvoid main(String[] args) {
Sessionsession=HibernateSessionFactory.getSession();
Deptd=new Dept();//自由状态
d.setDeptno((byte)15);
d.setDname("文化部");
d.setLoc("河北邯郸");
Transactiontran=session.beginTransaction();
session.save(d);//持久状态
tran.commit();
session.flush();
Transactiontran2=session.beginTransaction();
session.delete(d);
tran2.commit();//由持久状态转化成自由状态
System.out.println(d.getDeptno());
}
执行结果:
Hibernate: insert into SCOTT.DEPT (DNAME, LOC,DEPTNO) values (?, ?, ?)
Hibernate: delete from SCOTT.DEPT where DEPTNO=?
15
(1) VO与PO的主要区别
从“实体对象是否被纳入Hibernate实体管理容器”的立场区分:
观点:将处于自由状态和游离状态的对象统称为值对象(VO即Value Object),而将处于持久状态的对象称为持久对象(PO即Persistence Object)
VO与PO的主要区别
VO是相对独立的实体对象,处于非管理状态
PO是由Hibernate纳入其“实体管理容器”的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反映到实际数据库中。
如果一个PO与其对应的Session实例分离,那么此时,它又会变成一个VO.