8

我想缓存Hibernate的第二级缓存中的一个对象,该对象具有映射到我的持久性映射文件中的复合标识。日志说,我第一次运行查询时,映射为composite-id的类被放入缓存中。但是,当我第二次运行查询时,该对象不会从缓存中提取。而是再次运行查询。休眠第二级缓存复合编号

Hibernate对二级缓存组合ID有问题吗?

相关信息:

  1. 使用Hibernate 3.1的Ehcache 2.4.2
  2. 复合ID类实现Serializable
  3. 运行查询时,第二次
  4. 我我使用一个新的Hibernate Session我正在使用hibernateTemplate.load(Class,ID)来检索对象

这就是我如何构建我的I d和执行我的查询:

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

你的复合id类是否正确实现了equals()'/'hashCode()'? – axtavt 2011-06-16 20:08:49

+0

是的,对不起,我也应该补充一点。它实现了两者。 – sma 2011-06-16 20:15:47

+0

既是复合标识又是实体Serializable? – Augusto 2011-06-16 20:24:24

回答

0

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

在bug报告中还有一个补丁,你可以自己应用它并且自己打补丁的Hibernate版本。