9

我正在尝试在 Hibernate 的二级缓存中缓存一个对象,该对象在我的持久性映射文件中映射了一个复合 ID。日志说我第一次运行查询时,映射为复合 ID 的类被放入缓存中。但是,当我第二次运行查询时,不会从缓存中提取对象。相反,它再次运行查询。

Hibernate 二级缓存复合 id 有问题吗?

相关资料:

  1. 使用休眠 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>

编辑:情节变厚了....

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

4

1 回答 1

0

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

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

于 2013-03-26T13:42:40.247 回答