首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么OPTIMISTIC_FORCE_INCREMENT不在二级缓存中增加版本?

为什么OPTIMISTIC_FORCE_INCREMENT不在二级缓存中增加版本?
EN

Stack Overflow用户
提问于 2021-12-21 10:28:55
回答 1查看 242关注 0票数 3

我有一个父-子关系,其中父属性持有@version属性,并且每当父或其子属性发生任何变化时,它都应该递增。

代码语言:javascript
复制
@Entity class Parent{
  @OneToMany(mappedBy = "parent", ...)
  Set<Child> children;

  @Version
  int version;
} 

@Entity class Child{
  @ManyToOne
  Parent parent;
}

为了存档这一点,每当我添加、修改或删除一个子文件时,我都会将父文件锁定在OPTIMISTIC_FORCE_INCREMENT模式中。

代码语言:javascript
复制
entityManager.lock(parent, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
// modify child

在事务完成之前,hibernate生成如下语句

代码语言:javascript
复制
/* forced version increment */ update
    "PARENT" 
set
    "VERSION"=? 
where
    "PARENT_ID"=? 
    and "VERSION"=?

数据库中的版本被正确地递增,而第二级缓存没有被更新。如果我选择了父程序,它将从二级缓存加载,而我仍然得到旧版本,我可以对它进行刷新或从二级缓存中删除它,但是它感觉不对,它只需要按照数据库的一致性进行更新。

我尝试了Infinispan和EHCache,它们的行为都是相同的,所以我认为这是一个hibernate问题。

这也是为什么Vlad的RootAware模式不能与二级缓存结合使用的原因。请参阅https://vladmihalcea.com/how-to-increment-the-parent-entity-version-whenever-a-child-entity-gets-modified-with-jpa-and-hibernate/

请参阅这个注释:https://stackoverflow.com/a/31003719/9354242,正如我在这条评论中所建议的那样,我在父列中添加了一个@LastModifiedDate列,并在修改子列时更新它。与OPTIMISTIC_FORCE_INCREMENT不同,我将不得不使用乐观的LockModeType,它正在工作,二级缓存和数据库都有正确的版本号,但我不认为这是一个很好的解决办法,因为每个开发人员都必须了解它,而且很有可能有人会忘记它。此外,添加这样的列也是一件坏事,只是作为一种解决办法。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2021-12-29 12:40:38

Parent类的缓存策略是什么?会是READ_ONLY吗?尝试添加一个缓存注释。

代码语言:javascript
复制
@Cache(usage = READ_WRITE)
@Entity
class Parent

..。到你的实体,看看情况是否有所改善!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70433987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档