首先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方法會強制與數據庫同步。
