Hibernate Envers 修订号顺序

Hibernate Envers revision number order

我使用 Envers 来审计我的实体。使用的数据库是 Oracle 11g。对于修订实体的修订号,我使用了一个oracle序列。但是由于 oracle 序列不能保证每次调用 nextval 时单调递增,在我的修订 table 中,我得到了这样的结果,

我们可以看到转数不是单调递增的。在我的实体的审计 table 中,我有这个:

通过将记录与修订号链接在一起形成时间线,我得到:

24 --> 1302 --> 1303 --> 1355 --> 1304 --> 1356 --> 1357 --> 1305 -->1358 --> 空

事实上,我有一个由 2 个服务器组成的集群。他们都可以将数据持久化到数据库中。我怀疑这与 revnumber 中的顺序问题有关。因为这个问题。像 MyEntity anEntity = auditReader.find(MyEntity.class, id, revNum) 这样的查询不起作用,因为 org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:117)。我在 where 子句

中检查了 Hibernate 生成的 SQL
 where
    myentity.rev<=?
    and myentity.revtype<>?
    and myentity.id=?
    and (
        myentity.revend>?
        or myentity.revend is null
    )

因此对于修订号 1356,检索了多个审计记录,例如 1356 --> 1357 和 1305 -->1358 因为 rev num 1356 就在两端之间。

我该如何解决这个问题?我的意思是让 rev number 一个接一个地单调递增。

更新

我的改版实体

@Entity
@RevisionEntity(CustomRevisionListener.class)
@Table(name = "REV_TABLE")
@SequenceGenerator(name = "GENERIC_GENERATOR", sequenceName = "SQ_REVISION_ID")
public class Revision {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator ="GENERIC_GENERATOR")
    @Column(nullable = false, name = REV)
    @RevisionNumber
    private long rev;

}

您可能想看一下 SequenceIdRevisionEntity class 中修订号序列是如何定义的。我们基本上定义如下:

@Id
@GeneratedValue(generator = "RevisionNumberSequenceGenerator")
@GenericGenerator(
        name = "RevisionNumberSequenceGenerator",
        strategy = "org.hibernate.envers.enhanced.OrderedSequenceGenerator",
        parameters = {
                @Parameter(name = "table_name", value = "REVISION_GENERATOR"),
                @Parameter(name = "sequence_name", value = "REVISION_GENERATOR"),
                @Parameter(name = "initial_value", value = "1"),
                @Parameter(name = "increment_size", value = "1")
        }
)
@RevisionNumber
private int id;

关键是指定 initial_valueincrement_size 定义为 1 以避免您在现有序列定义中注意到的高低差距。