Hibernate二级缓存复合ID

时间:2011-06-16 20:01:25

标签: hibernate ehcache second-level-cache composite-primary-key

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

Hibernate是否存在二级缓存复合ID的问题?

相关信息:

  1. 使用Hibernate 3.1,ehcache 2.4.2
  2. 复合ID类实现可序列化
  3. 我在第二次运行查询时使用新的Hibernate会话
  4. 我正在使用hibernateTemplate.load(Class,ID)来检索对象
  5. 这就是我构建我的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>
    

    编辑:情节变浓......

    当我将其更改为只读缓存策略时,它运行正常。事务性缓存行为似乎极不可预测。任何人都可以解释为什么上述情况发生在读写缓存中,但在只读时运行良好吗?此表未更新,因此不确定为什么事务语义会改变该实例中的内容。

1 个答案:

答案 0 :(得分:0)

这看起来像报道的bug with Hibernate。似乎作为一种变通方法,如果您使用复合键的相同实例,可能能够成功点击缓存,而不是.equals()

错误报告上还有一个补丁,您可以自己应用它并滚动自己修补的Hibernate构建。