Hibernate二级缓存复合ID

sma*_*sma 8 hibernate ehcache second-level-cache composite-primary-key

我试图在Hibernate的二级缓存中缓存一个对象,该缓存在我的持久性映射文件中映射了一个复合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);
Run Code Online (Sandbox Code Playgroud)

这就是我的持久性映射文件定义上述内容的方式:

<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>
Run Code Online (Sandbox Code Playgroud)

编辑:情节变厚....

当我将其更改为只读缓存策略时,它工作正常.事务性缓存行为似乎极不可预测.任何人都可以解释为什么上述情况发生在读写缓存中,但在只读时运行良好吗?此表未更新,因此不确定为什么事务语义会改变该实例中的内容.

sha*_*kan 0

这看起来像是Hibernate 报告的错误。似乎作为一种解决方法,如果您使用复合键的相同实例(而不是.equals().

错误报告上还有一个补丁,您也许可以自己应用它并推出您自己的修补后的 Hibernate 版本。