zoukankan      html  css  js  c++  java
  • Hibernate学习之hibernate执行顺序

     
    Hibernate 执行的顺序如下: 
     (1) 生成一个事务的对象,并标记当前的 Session 处于事务状态(注:此时并未启动数据库级事务)。 
     (2) 应用使用 s.save 保存对象,这个时候 Session 将这个对象放入 entityEntries ,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作, Session 还要在 insertions 中登记应用的这个插入行为(行为包括:对象引用、对象 id 、 Session 、持久化处理类)。 
     (3) s.evict 将对象从 s 会话中拆离,这时 s 会从 entityEntries 中将这个对象移出。 
     (4) 事务提交,需要将所有缓存 flush 入数据库, Session 启动一个事务,并按照 insert,update,……,delete 的顺序提交所有之前登记的操作(注意:所有 insert 执行完毕后才会执行 update ,这里的特殊处理也可能会将你的程序搞得一团糟,如需要控制操作的执行顺序,要善于使用flush ),现在对象不在 entityEntries 中,但在执行 insert 的行为时只需要访问 insertions 就足够了,所以此时不会有任何的异常。异常出现在插入后通知 Session 该对象已经插入完毕这个步骤上,这个步骤中需要将 entityEntries 中对象的 existsInDatabase 标志置为 true ,由于对象并不存在于 entityEntries 中,此时 Hibernate 就认为 insertions 和 entityEntries 可能因为线程安全的问题产生了不同步(也不知道 Hibernate 的开发者是否考虑到例子中的处理方式,如果没有的话,这也许算是一个 bug 吧),于是一个 net.sf.hibernate.AssertionFailure 就被抛出,程序终止。 
        一般我们会错误的认为 s.save 会立即执行,而将对象过早的与 Session 拆离,造成了 Session 的 insertions 和 entityEntries 中内容的不同步。所以我们在做此类操作时一定要清楚 Hibernate 什么时候会将数据 flush 入数据库,在未 flush 之前不要将已进行操作的对象从 Session 上拆离,解决办法是在 save 之后,添加 session.flush 。

    session.evict(obj) :会把指定的缓冲对象进行清除,如果无论何时,当你给 save() 、 update() 或 saveOrUpdate() 方法传递一个对象时,或使用load() 、 get() 、 list() 、 iterate() 或 scroll() 方法获得一个对象时,该对象都将被加入到Session 的内部缓存中。当随后 flush() 方法被调用时,对象的状态会和数据库取得同步。如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用 evict() 方法,从一级缓存中去掉这些对象及其集合 

    session.clear() :如若要把所有的对象从 session 缓存中彻底清除,则需要调用  Session.clear(),对于二级缓存来说,在 SessionFactory 中定义了许多方法,清除缓存中实例、整个类、集合实例或者整个集合

    1 sessionFactory.evict(Cat.class, catId); //删除指定Cat实例对象
    2 sessionFactory.evict(Cat.class); //删除所有Cat实例对象
    3 sessionFactory.evictCollection("Cat.kittens", catId); //删除Cat实例中的一个集合
    4 sessionFactory.evictCollection("Cat.kittens"); //删除Cat实例中的所有集合
  • 相关阅读:
    wc.exe个人项目
    自我介绍+软工5问
    软件工程团队作业-测试与发布
    结对项目
    个人项目作业
    自我介绍+软工5问
    代码开发、测试及发布
    需求改进&系统设计
    综合系统开发——需求分析
    读书笔记----软件设计原则、设计模式
  • 原文地址:https://www.cnblogs.com/sunfie/p/4714179.html
Copyright © 2011-2022 走看看