gpt4 book ai didi

Hibernate二级缓存Composite-ID

转载 作者:行者123 更新时间:2023-12-04 08:56:03 25 4
gpt4 key购买 nike

我试图在Hibernate的二级缓存中缓存一个对象,该对象在我的持久性映射文件中映射了一个复合ID。日志显示,第一次运行查询时,映射为Composite-id的类将放入高速缓存中。但是,当我第二次运行查询时,该对象未从高速缓存中拉出。相反,它再次运行查询。

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

相关信息:

  • 使用Hibernate 3.1,ehcache 2.4.2
  • 复合ID类实现可序列化的
  • 再次运行查询时,我正在使用新的Hibernate session
  • 我正在使用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二级缓存Composite-ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377866/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com