欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate中的持久化对象状态说明

程序员文章站 2022-06-08 22:09:36
...
Hibernate框架中为持久化的对象设计了三种状态,处于这三种状态的对象通过一定的操作对象状态可以发生相互转化:
transient--瞬时态:通过new关键字创建的实体对象或尚未与Hibernate Session关联的对象,失去引用的话,就会被Java虚拟机回收。
persistent--持久态:通过get/load、Query查询获得或已经与当前Hibernate Session产生关联,并且相关联的session没有关闭,且事务尚未提交。
detached--脱管态:无法直接获得;存在持久化OID,但没有与当前Hibernate Session关联,hibernate不能检测到脱管状态改变

如下代码所示:
        Session session = HibernateUtils.openSession();  
        // 开启事务  
        Transaction transaction = session.beginTransaction();  
  
        Dog dog = new Dog (); // 瞬时态(没有OID,未与Session关联)  
        dog .setName("小狗狗");  
        dog .setAge(1);  
  
        session.save(dog );// 持久态(具有OID,与Session关联)  
  
        // 提交事务,关闭Session  
        transaction.commit();  
        session.close();  
  
        System.out.println(dog .getId()); // 脱管态(具有 OID,与Session断开关联)  


持久化对象之间的状态转换:
持久化对象之间的转变:

  • 瞬时——持久:save、saveOrUpdate
  • 瞬时——脱管:对象.setID(1);为瞬时对象设置新的OID
  • 持久——瞬时:delete(被删除持久化对象,不建议再次使用)
  • 持久——脱管:evict(清除一级缓存中某个对象)、close(关闭Session,清除一级缓存)、clear(清除一级缓存所有对象)
  • 脱管——瞬时:对象.setID(null);删除对象OID
  • 脱管——持久:update、saveOrUpdate、lock