【问题标题】:Hibernate second-level cache composite-idHibernate二级缓存composite-id
【发布时间】:2011-09-16 16:45:24
【问题描述】:

我正在尝试在 Hibernate 的二级缓存中缓存一个对象,该对象在我的持久性映射文件中映射了一个复合 ID。日志说我第一次运行查询时,映射为复合 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>

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

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

【问题讨论】:

  • 你的复合id类是否正确实现了equals()/hashCode()
  • 是的,对不起,我也应该添加的。它实现了两者。
  • 复合id和实体都可以序列化吗?
  • 是的,它们都是可序列化的
  • 你具体在做什么?您如何运行查询以及如何将对象放入缓存中?我们是在谈论实体还是查询缓存?

标签: hibernate ehcache second-level-cache composite-primary-key


【解决方案1】:

这看起来像是报告的bug with Hibernate。似乎作为一种解决方法,如果您使用复合键的相同实例而不是 .equals() 实例,您可能能够成功命中缓存。

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

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 2015-05-14
    • 2010-11-16
    • 2014-11-28
    • 2011-12-18
    • 2012-12-12
    • 2016-05-10
    • 2014-03-15
    • 2010-10-16
    相关资源
    最近更新 更多