session.flush()[轉載]

hibernate一個Session有一個Cache,cache屏蔽了應用程序直接去訪問數據庫,如果同一張table的同一row在先前已經被請求過,那麼爲何下次請求的時候還要去請求一次呢,把前面的cache住,再遇到這樣的請求直接返回cache裏邊的即可。

cache裏邊的數據如果含有髒數據,需要跟數據庫同步(也就是需要hibernate來發送update, delete, insert),調用session.flush()達到此目的。一般情況下,hibernate在一個tx.commit()的時候會自動調用session.flush();也可以應用程序手動調用session.flush()來立刻將session的髒數據提交。

[color=darkblue]Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
try{
Employee employee1 = (Employee)session.load(Employee.class, new Integer(3));
System.out.println(employee1);
employee1.setAge((byte)98);
session.flush();//發送employee1的update給數據庫
// employee1.setAge((byte)43);
tx.commit();//employee1已經被flush過,不會再被flush。如果把上面以行代碼註釋取消,還會再發一條update語句。
}
catch(HibernateException e){
e.printStackTrace();
tx.rollback();
}

tx = session.beginTransaction();
Employee employee2 = (Employee) session.load(Employee.class, new Integer(3));
employee2.setGender('f');
System.out.println(employee2);
tx.commit();[/color]


session.flush()的動作執行的時候,session中cache不會被清空,所以上面的employee2和employee1返回的還是同一個實例。

那些被flush()過的對象不會在下次flush()的時候再被flush()一次,除非兩次flush()中間又產生了新的髒數據。

我認爲應用程序基本上不需要顯示去調用session.flush();而交給tx.commit()去做就可以了。原因是:手動調用session.flush()雖然是往數據庫提交了update等sql語句,但是這些update真正的commit是在tx.commit()執行的時候。所以手動session.flush()後,其他的session或者是其他的應用程序看到的仍然還是數據庫以前的數據。(可以試驗)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章