使用多个实例访问 SpringBoot 3/Hibernate 6 中的 Envers 修订版

问题描述 投票:0回答:1

在 SpringBoot 3 (Hibernate 6) 中,序列生成器现在分配多个增量。这也适用于 Envers 修订号。

Defaults for implicit sequence generators Implicit sequences, like the hibernate_sequence before, now respect the defaults of the JPA @SequenceGenerator annotation, which means that the sequences have an allocation size of 50.
https://docs.jboss.org/hibernate/orm/6.0/migration-guide/migration-guide.html

当尝试访问实体的先前版本时,Envers 指南建议使用修订号查询 AuditReader。第 5 章 https://docs.jboss.org/envers/docs/ ...

.setProjection(AuditEntity.revisionNumber().min())

现在的问题是我正在运行一个服务的多个实例。每个服务预先分配50个序列号。这样做的结果是,有时实体有一个较新的修订条目,其修订版本号较低。 我尝试访问实体的最新/最旧版本,有时它只是错误的版本,因为修订号不再与条目的“年龄”按顺序排列。

SpringBoot 3 中是否有一个建议的路径来访问具有 Spring Boot 应用程序的多个实例的特定修订条目?

我尝试使用 revfinfo 表中的修订时间戳来不再使用修订号。我遇到了问题,因为时间戳不是修订条目的一部分,因此无法使用

AuditEntity.getRevisionDate().
访问修订时间戳仅存在于
revinfo
表中。

我还考虑过将allocation_size改回1。

如果有人现在知道在 Spring Boot 3/Hibernate 6 中解决此问题的预期方法是什么,我将不胜感激。使用单个服务的多个实例应该并不罕见。

spring spring-boot hibernate hibernate-envers
1个回答
0
投票

我找到了解决这个问题的两种方法。访问 AuditTable 并通过时间戳选择它:

@Transactional
public Integer getNewestRevisionOfMyCustomEntity(Long myCustomEntityId) {
  Optional<DefaultRevisionEntity> newestRevision = reader.createQuery()
          .forRevisionsOfEntity(MyCustomEntity.class, false, false)
          .add(AuditEntity.id().eq(myCustomEntityId))
          .getResultList()
          .stream().map(element -> {
              if(element instanceof Object[]) {
                  Object defaultRevisionEntity = ((Object[]) element)[1];
                  if (defaultRevisionEntity instanceof DefaultRevisionEntity) {
                      return defaultRevisionEntity;
                  }
              }
              throw new IllegalStateException("Could not access DefaultRevisionEntity in AuditManager");
          }).max(Comparator.comparing(defaultRevisionEntity -> ((DefaultRevisionEntity) defaultRevisionEntity).getTimestamp()));
  return newestRevision.orElseThrow(IllegalStateException::new).getId();
}

或者简单地在 envers 遗留模式下配置 springBoot :

spring.jpa.properties.hibernate.id.db_structure_naming_strategy: legacy 

and the corresponding sql "resets"

ALTER SEQUENCE revinfo_seq RENAME TO hibernate_sequence;
ALTER SEQUENCE hibernate_sequence INCREMENT BY 1; 
© www.soinside.com 2019 - 2024. All rights reserved.