hibernate实体对象的生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhengTornado/article/details/53337492

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.

猜你喜欢

转载自blog.csdn.net/zhengTornado/article/details/53337492
今日推荐