2011-11-02 55 views
2

Hibernate的抱怨, 的版本號:Hibernate試圖更新所致只讀對象

java.lang.UnsupportedOperationException:在 org.hibernate.cache無法寫入只讀 對象。 ReadOnlyCache.lock(ReadOnlyCache.java:68)

對於具有@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)但未被修改的類。 Class A具有通過註釋定義Class B一個many-to-many關係,

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @MapKey(name = "abbreviation") 
    private Map<String, B> allBs; 

我創造的Class A一個新的對象,並將其與Class B現有對象,但由於一些未知的原因,Hibernate試圖修改版本和lastmodified時間關聯的Class B

如果我刪除READ_ONLY註釋它工作正常,並沒有理由的版本和B的最後修改日期被從加入表a_b條目除了更新;

這是Hibernate做的事情 - 即使只添加了一個新的關聯並且對象本身沒有改變,也要寫入B?

+0

我有同樣的問題,但是當我嘗試刪除註釋時,會生成錯誤。代碼無法運行。 –

回答

2

看來,Hibernate試圖鎖定對象,即使對於只讀可緩存實體也是允許的某些操作。我在試圖刪除一個(使用Infinispan緩存)時碰到了這個問題。然而,只要嘗試鎖定,處理只讀緩存的hibernate的低級部分就會拋出一個異常,因爲(我認爲)它認爲這意味着修改實體的意圖。

這對我來說似乎是Hibernate部分的錯誤行爲。嘗試在ReadOnlyCache(以及org.hibernate.cache.infinispan.entity.ReadOnlyCache.java中)中拋出異常拋出,並在必要時返回null。然後重新編譯hibernate /替換jar中的那些.class文件。我不能保證這不會引入與併發緩存訪問相關的錯誤,儘管它似乎對我很有用。

0

我面臨着同樣的異常,背後的原因是,當實體創建並在實體中設置值時。在此之後,當調用session.save()方法時,hibernate會對實體中的集合進行一些更改或修改,但我的集合是隻讀的。改變和修改什麼冬眠做,我不知道,但是當我更改usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE這項工作成功。

1

我認爲你不必放級聯= CascadeType.ALL,因爲你的實體是READ-ONLY hibernate會執行一個READ-ONLY刪除嘗試將一個CascadeType.NONE放入一個READ-ONLY實體

0

高速緩存在Hibernate的第二級cache.You可以添加

<prop key="hibernate.cache.use_second_level_cache">false</prop>

下休眠特性,以解決這個問題。

相關問題