【Hibernate二】对象的状态

持久化状态的对象:
   1、hibernate的对象的状态分为三种:
        (1)、临时状态的对象
            利用new关键字创建出来一个对象
        (2)、持久化状态的对象
            session.get(),session.save(),session.update()
        (3)、脱管状态的对象
             session.clear():从session中清理所有的对象
             session.evict(obj):从session中清除单个对象
             session.close()
   2、只有处于持久化状态的对象,该对象才能跟session交互
   3、当执行事务提交的时候,hibernate内部会检查session中所有的持久化对象,发出相应的SQL语句
   4、一个脱管状态的对象,如果在事务提交的时候,要想发出update语句或者insert语句,必须把脱管状态变成持久化状态
   5、一个对象的持久化状态是针对某一个session的

示例代码:
      @Test
      public  void savePerson(){
          Session session =   sessionFactory.openSession();
          Transaction transaction = session.beginTransaction();
          
          Person person =  new Person();//临时状态
          person.setPname(  "云三班长" );//临时状态
          person.setPsex(  "不详");//临时状态
          
          session.save(person);  //变成持久化状态
          transaction.commit();
          session.close();  //脱管状态
     }
     
      @Test
      public  void testUpdatePerson(){
          Session session =  sessionFactory.openSession();
          Transaction transaction = session.beginTransaction();

          Person person = (Person) session.get(Person. class  ,1L);//person已经是持久化状态
          person.setPname(  "aaaa");

          session.update(person);  //session.update方法作用:把一个对象变成持久化状态,但是这里用不着
          transaction.commit();
          session.close();
     }
     
      @Test
      public  void testClear(){
          Session session =  sessionFactory.openSession();
          Transaction transaction = session.beginTransaction();

          Person person = (Person) session.get(Person. class  ,1L);//person已经是持久化状态
          person.setPname(  "asfd");//持久化状态

          session.clear();  //把session中所有的对象全部清空  脱管状态
          session.update(person);  //持久化状态,不加的话,无法Update
          transaction.commit();
          session.close();
     }
     
      @Test
      public  void testEivct(){
          Session session =  sessionFactory.openSession();
          Transaction transaction = session.beginTransaction();

          Person person = (Person) session.get(Person. class  ,1L);//person已经是持久化状态
          person.setPname(  "1111");//持久化状态
          session.evict(person);  //把person对象从session中清空  person是一个脱管状态的对象
          session.update(person);  //持久化状态

          transaction.commit();
          session.close();
     }
     
      /*
      * 当执行transaction.commit的时候,
      * hibernate会检查session中所有的持久化状态的对象
      *    如果该对象的id值在数据库中没有对应的记录,执行insert操作
      *    如果该对象的ID值在数据库中有对应的记录,和快照区的副本进行对比,如果一样,则什么都不做,如果不一样,则执行update操作
      */
      @Test
      public  void testSaveUpdate(){
          Session session =  sessionFactory.openSession();
          Transaction transaction = session.beginTransaction();
          
          Person person =  new Person();//临时
          person.setPname(  "云三班长小米" );//临时
          person.setPsex(  "手机不错" );//临时
          
          Person person2 = (Person)session.get(Person. class  , 1L);//持久
          person2.setPname(  "44");
          session.save(person);  //由临时转变成持久化状态
          
          transaction.commit();  //既有insert,又有update;
          session.close();
     }
     
      /**
      * 一个session中的对象持久化状态与另一个session 无关;
      */
      @Test
      public  void testSession(){
          Session session =  sessionFactory.openSession();
          Transaction transaction = session.beginTransaction();
          
          Person person2 = (Person)session.get(Person. class  , 1L);//持久化状态
          person2.setPname(  "rty");
          transaction.commit();
          session.close();
          
          session =  sessionFactory.openSession();//又开启了一个新的session
          Transaction transaction2 = session.beginTransaction();
          person2.setPname(  "56yy");
          session.update(person2);  //让person2和新的session交互
          transaction2.commit();
          session.close();
     }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值