我正在尝试在Hibernate的二级缓存中缓存一个对象,该缓存在我的持久性映射文件中映射了一个复合id。日志说我第一次运行查询时,映射为composite-id的类被放入缓存中。但是,当我第二次运行查询时,不会从缓存中提取对象。它反而再次运行查询。
Hibernate是否存在二级缓存复合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>
编辑:情节变浓......
当我将其更改为只读缓存策略时,它运行正常。事务性缓存行为似乎极不可预测。任何人都可以解释为什么上述情况发生在读写缓存中,但在只读时运行良好吗?此表未更新,因此不确定为什么事务语义会改变该实例中的内容。
答案 0 :(得分:0)
这看起来像报道的bug with Hibernate。似乎作为一种变通方法,如果您使用复合键的相同实例,可能能够成功点击缓存,而不是.equals()
。
错误报告上还有一个补丁,您可以自己应用它并滚动自己修补的Hibernate构建。