首先session是有一級緩存的,目的是為了減少查詢數據庫的時間,提高效率,一級緩存的生命周期和session是一樣的,
session.flush()和session.clear()就針對session的一級緩存的處理。
簡單的說,
1 session.flush()的作用就是將session的緩存中的數據與數據庫同步。
2 session.clear()的作用就是清除session中的緩存數據(不管緩存與數據庫的同步)。
3.session.refresh():會強制發送select語句,以使session緩存中對象的狀態和數據表中對應的記錄保持一致。該方法的有效性需要配置事務的隔離級別為read commited(讀已提交)。
注意:
執行完session.flush()時,並不意味着數據就肯定持久化到數據庫中的,因為事務控制着數據庫,如果事務提交失敗了,緩存中的數據還是照樣會被回滾的。
舉例:
@Test public void testFlush(){ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.get(Teacher.class, 3); t.setName("yyy"); t.setName("yyyyy"); session.getTransaction().commit(); }
看這段代碼,我們setName() 2次, 但程序只會更改數據庫一次,在commit時。
@Test public void testFlush(){ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.get(Teacher.class, 3); t.setName("yyy"); session.flush();//有flush會執行2次UPDAE,沒有會只執行一次 t.setName("yyyyy"); session.getTransaction().commit(); }
我們在第2次setName()時 執行session.flush().
再看hibernate 執行的sql 語句 Hibernate: update Teacher set birthday=?, name=?, title=? where id=? Hibernate: update Teacher set birthday=?, name=?, title=? where id=?
執行了2次Update
所以看出來flush方法會強制與數據庫同步。