10---Hibernate持久化对象的三种状态和状态转换关系

114人阅读 评论(0) 收藏 举报
分类:

Hibernate持久化对象的三种状态和状态转换关系

1.持久化对象的三种状态
    首先复习2个概念:持久化对象PO和OID
    PO = POJO + hbm映射配置
    编写规则
必须提供无参数 public 构造器
所有属性 private 提供 publicgettersetter方法
必须提供标识属性,与数据表中主键对应 ,例如 Customer id属性 
PO类属性应尽量使用基本数据类型的包装类型(区分空值)  例如 int --- Integer  long--- Long 
不要用final修饰(将无法生成代理对象进行优化)
    OID 指与数据表中主键对应 PO类中属性,例如 Customer类 id属性 
    Hibernate框架使用OID来区分不同PO对象 
        * 例如 内存中有两个PO对象,只要具有相同 OID, Hibernate认为同一个对象 
* Hibernate 不允许缓存同样OID的两个不同对象

    瞬时态(临时态、自由态):不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于瞬时态,失去引用将被JVM回收
    持久态:存在持久化标识OID,与当前session有关联,并且相关联的session没有关闭 ,事务未提交 
    脱管态(离线态、游离态):存在持久化标识OID,但没有与当前session关联,脱管状态改变hibernate不能检测到

    区分三种状态:判断对象是否有OID,判断对象是否与session关联(被一级缓存引用)
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
 
Book book = new Book(); // 瞬时态(没有OID,未与Session关联)
book.setName("hibernate精通");
book.setPrice(56d);
 
session.save(book);// 持久态(具有OID,与Session关联)
 
// 提交事务,关闭Session
transaction.commit();
session.close();
 
System.out.println(book.getId()); // 脱管态(具有 OID,与Session断开关联)

2.持久化对象状态转换

    瞬时态对象:通过new获得
        瞬时----->持久    save、saveOrUpdate(都是session)
        瞬时----->脱管    book.setId(1) 为瞬时对象设置OID

    持久态对象:通过get/load 、Query查询获得
持久----->瞬时    delete  (被删除持久化对象 不建议再次使用 )
持久----->脱管    evict(清除一级缓存中某一个对象)、close(关闭Session,清除一级缓存)、clear(清除一级缓存所有对象 ) 

    脱管态对象 无法直接获得
脱管----->瞬时    book.setId(null); 删除对象OID 
脱管----->持久    update、saveOrUpdate、 lock(过时) 


查看评论

More Effective C++ 条款27(下)

条款27:要求或禁止在堆中产生对象(下)到目前为止,这种逻辑很正确,但是不够深入。最根本的问题是对象可以被分配在三个地方,而不是两个。是的,栈和堆能够容纳对象,但是我们忘了静态对象。静态对象是那些在程...
  • zhc
  • zhc
  • 2001-11-15 22:21:00
  • 859

Hibernate持久化对象的状态及状态之间的转换

hibernate持久化对象的三种状态,瞬态,持久化,托管 ; 三种状态之间的的状态转换图 ; save(),persist()的区别与联系 ; load() 和 get()方法的区别与联系; u...
  • liuxins
  • liuxins
  • 2016-04-03 14:44:04
  • 2417

hibernate持久化对象的三个状态

Hibernate中的对象有3种状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象)。这三个状...
  • wangdan199112
  • wangdan199112
  • 2015-08-19 12:14:10
  • 2323

Hibernate入门(四)之持久化对象的三种状态

持久化对象的三种状态概述Hibernate为了更好的管理持久化类,将持久化类分成了三种状态。 - 瞬时态(transient) 瞬时态也被称为临时态或自由态,瞬时态的实例是由new命令创建、开辟内...
  • qq_36376387
  • qq_36376387
  • 2017-12-02 01:22:52
  • 87

Hibernate旅程(三)Hibernate持久化对象的三个状态

Hibernate中的对象有3中状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象)。 下...
  • lovesummerforever
  • lovesummerforever
  • 2014-02-13 21:57:17
  • 28609

进程的三种基本状态及其转换

介绍了进程的三种基本状态以及它们之间的转换
  • u011012049
  • u011012049
  • 2015-08-13 23:15:19
  • 4041

Hibernate实体对象的三种状态以及困惑

Hibernate官方文档manaul中提到,hibernate实体有三种状态:Transient、Persistent、Detached。本文参考了官网手册和http://blog.csdn.net...
  • aitangyong
  • aitangyong
  • 2014-04-16 20:33:00
  • 1665

Java面试题全集(14)

131、阐述Session加载实体对象的过程。  答:Session加载实体对象的步骤是:  ① Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存查找...
  • heiyueya
  • heiyueya
  • 2017-03-13 20:50:34
  • 168

Java - 阐述实体对象的三种状态以及转换关系。

最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态),分别是:瞬时态(new, or transient)、持久态(managed, or persistent)、游...
  • chimomo
  • chimomo
  • 2017-11-07 09:58:05
  • 188

进程的三种状态及相互之间的转换

1.进程的三种基本状态     进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。  就绪(Ready)状态     当进程已分配到除CPU以外的所有必要...
  • zhquanquan
  • zhquanquan
  • 2016-05-17 21:21:43
  • 2614
    个人资料
    等级:
    访问量: 5923
    积分: 742
    排名: 6万+
    文章存档