1. 程式人生 > >Hibernate中 session.delete()疑問?

Hibernate中 session.delete()疑問?

當時覺得奇怪 為什麼Hibernate實現的 session.delete(String hql);是先 session.find(String hql) 然後在查詢的結果集中一個一個的刪掉。因為要是想sql中的 delete  from table where ......是非常容易的。這其中肯定存在著一些難言之隱。

今天在公交車上找到了答案。

原來最終禍首都是 Hibernate Cache。

Hibernate之所以要一個一個刪,也就是為了維護hibernate中的內部快取和sessionFactory快取。

試想下假如我把資料庫中的資料刪了,但是hibernate中的對應快取沒有清理,當用戶再次查詢的時候可能會得到快取中的資料(實際上在資料庫中的資料已經刪除),這樣的話就是變成一個bug了。

但是我想為什麼不可以在刪除之前去維護Hibernate中的快取呢? 然後還是用一條sql去刪除。(這樣的話效能還是會比現在的快得多, 一條select 語句和一條delete語句, 現在是一條select語句和多條delete語句)

但我得到的答案是假如這樣做的話 Hibernate就相當實現了一個支援sql的記憶體資料庫,這樣對於一個輕量集的ormapping來說是太苛刻了。

那我們遇到批量刪除該怎麼辦呢? 我們可以hibernate.jdbc.batch_size = 25來適當的提高效能。

在hibernate3中可以使用  session.createQuery("delete from TUser") 來解決,但是還是沒有維護Hibernate中的快取。可以說是治標不治本。