博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate三种状态
阅读量:7113 次
发布时间:2019-06-28

本文共 2431 字,大约阅读时间需要 8 分钟。

Hibernate实体对象的状态:    瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)

A.瞬时态: (Value Object) / [VO]

  当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:

                         Customer customer=new Customer(“zx”,27,images);
       这时customer对象就处于自由状态,为什么说customer对象处于自由状态呢?这是因为,此时customer只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。

 

B.持久态: ( Persistence Object ) / [PO]

  持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:

    Customer customer=new Customer(“zx”,27,images);
    tx=session.beginTransaction();
    session.save(customer);
    customer=(Customer)session.load(Customer.class,”1”);
    customer.setAge(28);
    tx.commit();
  这时我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时customer对象通过save方法保存进数据库后,已经是持久化对象了,然后通过load方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。

C.脱管态: (游离态)

  当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:

     Customer customer=new Customer(“zx”,27,images);
     tx=session.beginTransaction();
  session.save(customer);
  customer=(Customer)session.load(Customer.class,”1”);
  customer.setAge(28);
  tx.commit();
  session.close();
当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与customer对象对应的数据记录,所以此时customer对象处于游离态。

三种对象状态之间的转化:

   这三种对象状态,是可以相互转化的,一个自由对象可以通过session.save()方法或者session.saveorupdate()方法变成持久化对象,一个持久化对象可以通过session.flush()或者session.evict()方法,移出Hibernate缓存从而转化为游离对象,一个游离对象可以通过再次加载或者调用session.update()方法,再次恢复为持久化对象,也可以通过调用session.delete()方法变成自由对象,并且删除数据库中对应的数据记录。
  示例程序:

    Configuration cfg = new Configuration();

       SessionFactory sf=cfg.configure().buildSessionFactory();
    Customer customer=new Customer(“zx”,27,images); //customer对象处于自由状态
         Session session=sf.openSession();
    Transaction tx=session.beginTransaction();
      session.save(customer); //保存后customer对象处于持久化状态
    session.flush(); //清空缓存后customer对象处于游离状态
    tx.commit();
    session.close();
    Session session2=sf.openSession();
    Transaction tx2=session2.beginTransaction();
    session2.update(customer); //通过调用update()方法将游离状态的customer对象,再次转化成持久化状态
    session2.delete(customer); //调用delete()方法后,当清空缓存时,会将customer对象移出缓存,同时会在数据库中生成delete事务,来删除customer对象对应的数据记录
    tx.commit();
    session.close();

 

转载于:https://www.cnblogs.com/bykj/p/4800533.html

你可能感兴趣的文章
Android渲染器Shader:LinearGradient(一)
查看>>
公有云中追寻区块链的身影
查看>>
1-学习GPRS_Air202(Air202开发板介绍)
查看>>
Scapy 中文文档:二、下载和安装
查看>>
CentOS 6.9下配置安装KVM
查看>>
专访地平线余凯:如果现在盈利了,说明我们没有未来 | 封面人物
查看>>
斯坦福大学华人教授研发柔性电子材料,软似皮肤并且可拉伸
查看>>
使用Spring Data Redis操作Redis(单机版)
查看>>
结合AI与IoT技术,日本研发出可英语会话的小鸟学习型机器人
查看>>
NumPy 特殊例程
查看>>
“高大上”的机器人世界杯RoboCup也能如此“接地气”
查看>>
阿里云ECS服务器活动99元一年,最高可买三年
查看>>
附录C 编译安装Hive
查看>>
Sql Server数据库触发器实例讲解
查看>>
OpenSSL密码算法库: MD5示例小程序
查看>>
Mac各种数据库安装和启动【笔记】
查看>>
HTTP状态码查询简单介绍
查看>>
Codeforces Round #323 (Div. 2) C.GCD Table
查看>>
浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法
查看>>
宅男福利!逼真3DCG虚拟少女Saya亮相
查看>>