Hibernate中关于对象状态的介绍

来源:互联网 发布:成都 德勤 咨询 知乎 编辑:程序博客网 时间:2024/06/05 15:37

对象状态介绍:

  • 瞬时/临时状态(Transient Objects)    

      使用new操作符初始化的对象不是立刻就持久化的,他们的状态是瞬时的。

      (1)不处于Session的缓存中,也可以说,不被任何一个Session实例关联。

      (2)在数据库中没有对应的记录。

  • 持久化状态Persist Objects

      持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的———他们的状态在事务结束时同数据库进行同步。

      (1)位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。

      (2)持久化对象和数据库中的相关记录对应。

      (3) Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。

  • 离线/游离对象Detached Objects

     Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。

      (1)不再位于Session的缓存中,也可以说,游离对象不被Session关联。

      (2)游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

         (前提条件是没有其他程序删除了这条记录)。


 

示例代码:

public classAppTest {

staticSessionFactory sessionFactory=null;

static{

sessionFactory=newConfiguration()

.configure()//加载Hibernate主配置文件hibernate.cfg.xml

.buildSessionFactory();//得到SessionFactory实例对象

}

@Test

public voidtestStatus(){

Session session=sessionFactory.openSession();

session.beginTransaction();//开启事务

/*-------------------执行操作----------------------*/

Student stu=newStudent();//new一个对象,临时状态,不处于session的管理范围,数据库中没有对应记录

stu.setName("zhangsan");

stu.setAge(20);

stu.setSex("male");

session.save(stu);//持久状态,处于session的管理范围,数据库中有对应记录

stu.setName("wangwu....");//会执行update操作

session.getTransaction().commit();//提交事务

session.close();//关闭session

stu.setName("zhangsan----");//游离状态,不处于session管理范围,数据库中可能有对应记录

System.out.println("输出结果=="+stu.getName());

}

/*游离状态-------->持久化状态*/

@Test

public voidtestChange(){

Session session=sessionFactory.openSession();

session.beginTransaction();

Student student=newStudent();

student.setId(1);//游离状态,数据库中存在id为1的记录

session.update(student);//转换为持久化状态

student.setName("xiaowang");//执行更新,反应到数据库

session.getTransaction().commit();

session.close();

}

}

0 0
原创粉丝点击