Hibernate commit() 和flush() 的区别

来源:互联网 发布:ti6双败赛制 知乎 编辑:程序博客网 时间:2024/05/20 11:24

[java] view plaincopyprint?
  1. <<精通Hibernate java对象持久化技术详解>> ,flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来   
  2. 所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库  
  3.   
  4. Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.  
  5.   
  6. commit针对事物的  
  7. flush针对缓存的  
  8. 同步到数据库中后只要没有commit还是可以rollback的  
  9.   
  10.    
  11.   
  12.   
  13.  public void testSave1() {  
  14.   Session session = null;  
  15.   Transaction tx = null;  
  16.   try {  
  17.    session = HibernateUtils.getSession();  
  18.    tx = session.beginTransaction();  
  19.    User1 user = new User1();  
  20.    user.setName("李四");  
  21.    user.setPassword("123");  
  22.    user.setCreateTime(new Date());  
  23.    user.setExpireTime(new Date());  
  24.      
  25.    //因为user的主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理  
  26.    //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false  
  27.    session.save(user);  
  28.      
  29.    //调用flush,hibernate会清理缓存,执行sql  
  30.    //如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据  
  31.    //并且session中existsInDatebase状态为true  
  32.    session.flush();  
  33.      
  34.    //提交事务  
  35.    //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush  
  36.    //commit后数据是无法回滚的  
  37.    tx.commit();  
  38.   }catch(Exception e) {  
  39.    e.printStackTrace();  
  40.    tx.rollback();  
  41.   }finally {  
  42.    HibernateUtils.closeSession(session);  
  43.   }  
  44.  }  
  45.    
  46.    
  47.  public void testSave2() {  
  48.   Session session = null;  
  49.   Transaction tx = null;  
  50.   try {  
  51.    session = HibernateUtils.getSession();  
  52.    tx = session.beginTransaction();  
  53.    User2 user = new User2();  
  54.    user.setName("张三1");  
  55.    user.setPassword("123");  
  56.    user.setCreateTime(new Date());  
  57.    user.setExpireTime(new Date());  
  58.      
  59.    //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id  
  60.    //纳入了session的管理,修改了session中existsInDatebase状态为true  
  61.    //如果数据库的隔离级别设置为未提交读,那么我们可以看到save过的数据  
  62.    session.save(user);  
  63.   
  64.    tx.commit();  
  65.   }catch(Exception e) {  
  66.    e.printStackTrace();  
  67.    tx.rollback();  
  68.   }finally {  
  69.    HibernateUtils.closeSession(session);  
  70.   }  
  71.  }  
0 0