Hibernate二级缓存复合id [英] Hibernate second-level cache composite-id

查看:0
本文介绍了Hibernate二级缓存复合id的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Hibernate的二级缓存中缓存一个对象,该对象在我的持久性映射文件中映射了一个复合id。日志显示,在我第一次运行查询时,映射为复合id的类被放入缓存。但是,当我再次运行查询时,不会从缓存中拉出该对象。而是再次运行查询。

Hibernate在二级缓存复合ID方面有问题吗?

相关信息:

  1. 使用Hibernate 3.1、ehcache2.4.2
  2. 复合ID类实现可序列化
  3. 我在第二次运行查询时使用的是新的休眠会话
  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>

编辑:情节加厚...

当我将其更改为只读缓存策略时,它工作得很好。事务性缓存行为似乎非常不可预测。有谁能解释一下为什么读写缓存会出现上述情况,而只读缓存却能很好地工作?此表未更新,因此不确定事务语义为何会更改该实例中的内容。

推荐答案

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

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

这篇关于Hibernate二级缓存复合id的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆