2012-06-12 60 views
0

我有許多一對多關係如下(在庫類型的應用):休眠緩存的陳舊數據:多對多單向映射

User:  
@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(
     name = "user_book", 
     joinColumns = {@JoinColumn(name = "fk_user")}, 
     inverseJoinColumns = {@JoinColumn(name = "fk_book")} 
) 
private List<Book> books = null; 

Book: 
@ManyToMany(cascade = {CascadeType.ALL}, 
      mappedBy = "books", fetch = FetchType.LAZY) 
private List<User> users; 

問題:當我編輯書的名稱,該值在表中得到更新,但是由於休眠緩存,User對象仍然保持對舊書實體的引用。所以,在後端我有正確的帳面價值,在UI上我仍然看到陳舊的價值。我正在使用ehcache並啓用二級緩存。 緩存配置:

<defaultCache 
     maxElementsInMemory="10000" 
     eternal="false" 
     timeToLiveSeconds="120" 
     overflowToDisk="false" 
     diskPersistent="false" 
     /> 
<cache name="org.hibernate.cache.UpdateTimestampsCache" 
     maxElementsInMemory="10000" 
     timeToIdleSeconds="300" 
     /> 

<cache name="org.hibernate.cache.StandardQueryCache" 
     maxElementsInMemory="10000" 
     timeToIdleSeconds="300" 
     /> 

我也在使用OEMIV過濾器。

+0

你的問題到底是什麼?如何配置緩存?你使用每次交易會話嗎?的session-per-談話?會話的每個請求? –

+0

問:如何讓我的冬眠編輯後不緩存舊值?我啓用了OEMIV過濾器。高速緩存配置如上所述(最近更新) – Supra

+0

您還沒有創建關聯高速緩存,因此它不能在第二級高速緩存中。我們不知道如何在Book實體上配置緩存。我們不知道如何編輯本書的名稱:通過Hibernate?相同的JVM? –

回答

0

我認爲你必須調用方法

Flush() 

這是因爲你做的第一或第二級緩存的任何更改將被存儲到緩存中,但它不是,直到你清空緩存,數據實際上存儲在數據庫中。

希望這會有所幫助!

+0

我的緩存肯定會被刷新,因爲我可以看到數據存儲在數據庫(mysql)中。 – Supra