轉: 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);  
  }  
 }  
相關文章
相關標籤/搜索