我有一个父-子关系,其中父属性持有@version属性,并且每当父或其子属性发生任何变化时,它都应该递增。
@Entity class Parent{
@OneToMany(mappedBy = "parent", ...)
Set<Child> children;
@Version
int version;
}
@Entity class Child{
@ManyToOne
Parent parent;
}为了存档这一点,每当我添加、修改或删除一个子文件时,我都会将父文件锁定在OPTIMISTIC_FORCE_INCREMENT模式中。
entityManager.lock(parent, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
// modify child在事务完成之前,hibernate生成如下语句
/* 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,它正在工作,二级缓存和数据库都有正确的版本号,但我不认为这是一个很好的解决办法,因为每个开发人员都必须了解它,而且很有可能有人会忘记它。此外,添加这样的列也是一件坏事,只是作为一种解决办法。
提前感谢
发布于 2021-12-29 12:40:38
Parent类的缓存策略是什么?会是READ_ONLY吗?尝试添加一个缓存注释。
@Cache(usage = READ_WRITE)
@Entity
class Parent..。到你的实体,看看情况是否有所改善!
https://stackoverflow.com/questions/70433987
复制相似问题