• Hibernate commit() 和flush() 的区别


    <<精通Hibernate java对象持久化技术详解>> ,flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来   

    • 所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库  
    •   
    • Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.  
    •   
    • commit针对事物的  
    • flush针对缓存的  
    • 同步到数据库中后只要没有commit还是可以rollback的  

    1、session在什么情况下清理缓存: * 默认情况下,当应用程序提交事务,

      如:Transaction.commit; * 当我们显示调用flush的时候 * 在执行某些查询的时候,如:iterate

    2、session.flush()主要完成两件事情: * 清理缓存 * 执行sql

    3、flush执行的顺序:hibernate按照save,update,delete顺序提交相关操作

    commit()和事务相关。执行时会先隐式调用flush()方法,再提交事务。执行之后无法rollback()进行回滚。

     public void testSave1() {
      Session session = null;
      Transaction tx = null;
      try {
       session = HibernateUtils.getSession();
       tx = session.beginTransaction();
       User1 user = new User1();
       user.setName("李四");
       user.setPassword("123");
       user.setCreateTime(new Date());
       user.setExpireTime(new Date());
       
       //因为user的主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理
       //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false
       session.save(user);
       
       //调用flush,hibernate会清理缓存,执行sql
       //如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据
       //并且session中existsInDatebase状态为true
       session.flush();
       
       //提交事务
       //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush
       //commit后数据是无法回滚的
       tx.commit();
      }catch(Exception e) {
       e.printStackTrace();
       tx.rollback();
      }finally {
       HibernateUtils.closeSession(session);
      }
     }
     
     
     public void testSave2() {
      Session session = null;
      Transaction tx = null;
      try {
       session = HibernateUtils.getSession();
       tx = session.beginTransaction();
       User2 user = new User2();
       user.setName("张三1");
       user.setPassword("123");
       user.setCreateTime(new Date());
       user.setExpireTime(new Date());
       
       //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id
       //纳入了session的管理,修改了session中existsInDatebase状态为true
       //如果数据库的隔离级别设置为未提交读,那么我们可以看到save过的数据
       session.save(user);
    
       tx.commit();
      }catch(Exception e) {
       e.printStackTrace();
       tx.rollback();
      }finally {
       HibernateUtils.closeSession(session);
      }
     }
  • 相关阅读:
    强化学习(David Silver)2:MDP
    【论文阅读-DL】《Understanding Black-box Predictions via Influence Functions》阅读
    强化学习(David Silver)1:简介
    【论文阅读-DL】《Understanding Black-box Predictions via Influence Functions》阅读
    生成模型和判别模型
    第6章:概率图模型
    基础算法问题
    【论文阅读-CTR】<<Optimized Cost per Click in Taobao Display Advertising>>阅读
    【论文阅读-对话系统】<<Neural Responding Machine for Short-Text Conversation>>阅读
    【读书笔记】——终极算法
  • 原文地址:https://www.cnblogs.com/sdream/p/5869312.html
Copyright © 2020-2023  润新知