zoukankan      html  css  js  c++  java
  • 转: Hibernate commit() 和flush() 的区别

    [java] view plaincopyprint?
    <<精通Hibernate java对象持久化技术详解>> ,flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来   
    所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库  
      
    Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.  
      
    commit针对事物的  
    flush针对缓存的  
    同步到数据库中后只要没有commit还是可以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);  
      }  
     }  
  • 相关阅读:
    [HDU2136] Largest prime factor(素数筛)
    [luoguP1082] 同余方程(扩展欧几里得)
    基本数论算法
    [luoguP2444] [POI2000]病毒(AC自动机 + dfs)
    [luoguP2564] [SCOI2009]生日礼物(队列)
    在EditText插入表情,并发送表情
    程序员自我提高的几点建议
    CSS3悬停特效合集Hover.css
    带动画效果的jQuery手风琴
    android程序的真正入口
  • 原文地址:https://www.cnblogs.com/shadowduke/p/5132913.html
Copyright © 2011-2022 走看看