【发布时间】:2011-09-16 16:45:24
【问题描述】:
我正在尝试在 Hibernate 的二级缓存中缓存一个对象,该对象在我的持久性映射文件中映射了一个复合 ID。日志说我第一次运行查询时,映射为复合 ID 的类被放入缓存中。但是,当我第二次运行查询时,不会从缓存中提取对象。而是再次运行查询。
Hibernate 二级缓存复合 id 有问题吗?
相关信息:
- 使用 Hibernate 3.1、ehcache 2.4.2
- 复合 ID 类实现可序列化
- 我在第二次运行查询时使用了新的 Hibernate 会话
- 我正在使用 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