Hibernate二级缓存复合id [英] Hibernate second-level cache composite-id
本文介绍了Hibernate二级缓存复合id的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试在Hibernate的二级缓存中缓存一个对象,该对象在我的持久性映射文件中映射了一个复合id。日志显示,在我第一次运行查询时,映射为复合id的类被放入缓存。但是,当我再次运行查询时,不会从缓存中拉出该对象。而是再次运行查询。
Hibernate在二级缓存复合ID方面有问题吗?
相关信息:
- 使用Hibernate 3.1、ehcache2.4.2
- 复合ID类实现可序列化
- 我在第二次运行查询时使用的是新的休眠会话
- 我正在使用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屋!
查看全文