• Hibernate 实体对象三种状态 :自由,持久,游离


    实体对象的状态及转化: 
    有了上面关于Hibernate缓存的知识,我们再来介绍实体对象的状态就非常容易理解了。 
    A:自由态对象: 
    当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下: 
    Customer customer=new Customer(“zx”,27,images); 
    这时customer对象就处于自由状态,为什么说customer对象处于自由状态呢?这是因为,此时customer只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。 
    B:持久化对象: 
    持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于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对象处于游离态。 
    D:三种对象状态之间的转化: 
    这三种对象状态,是可以相互转化的,一个自由对象可以通过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(); 
    

      

  • 相关阅读:
    使用 jsPlumb 绘制拓扑图 —— 异步加载与绘制的实现
    改善记忆力的二十种记忆方法,随便你挑!
    怎样完成一次比较漂亮的晋升面试演讲
    产品运维的思考与总结
    Jtester+unitils+testng:DAO单元测试文件模板自动生成
    生活、工作和理想
    推荐《需求:缔造伟大商业传奇的根本力量》
    星光之旅
    谈读书
    生命之反思
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/6862307.html
Copyright © 2020-2023  润新知