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

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(过时) 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值