在 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 中解决此问题的预期方法是什么,我将不胜感激。使用单个服务的多个实例应该并不罕见。
我找到了解决这个问题的两种方法。访问 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;