2011-05-25 66 views
2

我在另一個應用程序中向外部添加項目時,未更新映射集合。當記錄插入到外部時,Hibernate集合未更新

禁用二級緩存。

例...

session = HibernateDataSource.openSession(); 
User dao = (User) session.load(User.class, 2434152); 
// No items now, this gives 0 
System.err.println(dao.getItems().size()); 
session.close(); 
Thread.sleep(10000); 
// Add an item outside, e.g. in PMA 
session = HibernateDataSource.openSession(); 
HibernateDataSource.getSessionFactory().evict(User.class); 
HibernateDataSource.getSessionFactory().evict(UserItem.class); 
HibernateDataSource.getSessionFactory().evictCollection(User.class.getName() + ".items"); 
dao = (User) session.load(User.class, 2434152); 
// Still zero 
System.err.println(dao.getItems().size()); 
session.close(); 

我在Google上搜尋時已經嘗試了幾種解決方案,例如將集合設置爲髒。沒有工作。

還有什麼我沒看過的?

P.S.首先嚐試Hibernate 3.2.7。升級到3.3.2,沒有區別。

回答

1

花費了95%的時間進入Hibernate後,它已經被免除了。

這個問題是由於MySQL的查詢緩存造成的,儘管名稱也是這樣,它也緩存可重複讀取的結果集。這是由於MySQL InnoDB的多版本化的特性造成的。

爲了「爲快照設置新的時間點」,即使只有選擇查詢,也要將您的工作單元包裝在事務中。

進一步閱讀...

http://forums.mysql.com/read.php?39,416790,416790

http://dev.mysql.com/doc/refman/5.0/en/query-cache.html