2011-05-25 76 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