簡體   English   中英

Hibernate二級緩存Composite-ID

[英]Hibernate second-level cache composite-id

我試圖在Hibernate的二級緩存中緩存一個對象,該對象在我的持久性映射文件中映射了一個Composite-id。 日志顯示,第一次運行查詢時,映射為Composite-id的類將放入緩存中。 但是,當我第二次運行查詢時,沒有從緩存中提取對象。 相反,它再次運行查詢。

Hibernate是否對二級緩存組合ID有問題?

相關信息:

  1. 使用Hibernate 3.1,ehcache 2.4.2
  2. 復合ID類實現可序列化
  3. 第二次運行查詢時,我正在使用新的Hibernate會話
  4. 我正在使用hibernateTemplate.load(Class,ID)檢索對象

這就是我構造ID並執行查詢的方式:

CompositeId id = new CompositeId(date, sessionId);
UserDetails user = (UserDetails) hibernateTemplate.load(UserDetails.class, id);

這就是我的持久性映射文件定義以上內容的方式:

<class name="com.entities.UserDetails"
        table="USER_DETAILS" 
        lazy="false">
    <cache usage="read-write"/>

    <composite-id name="userId" class="com.entities.CompositeId" unsaved-value="undefined">
        <key-property name="userSessionId" column="SESSION_ID" />
        <key-property name="dateCreated" column="DATE_CREATED" type="date" />
    </composite-id>

編輯:情節變厚....

當我將其更改為只讀緩存策略時,它可以正常工作。 事務性緩存行為似乎極其不可預測。 誰能解釋為什么上述情況發生在讀寫緩存中,而在只讀緩存中卻能正常工作? 該表未更新,因此不確定為什么事務語義會更改該實例中的內容。

這看起來像是Hibernate的一個已報告錯誤 看來,作為一種變通方法,您可能能夠成功擊中緩存,如果您使用組合鍵相同的實例,而不是一個是.equals()

錯誤報告上還有一個補丁,您可以自己應用它,也可以滾動自己的補丁Hibernate構建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM