Hibernate Envers修订号订单

时间:2018-01-08 16:47:20

标签: oracle hibernate hibernate-envers

我使用Envers来审核我的实体。使用的DB是Oracle 11g。对于修订实体的修订号,我使用了oracle序列。但是由于oracle序列不能保证每次调用nextval的单调增加,在我的修订表中,我得到了类似的东西,enter image description here

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

通过将记录与转号一起链接以形成时间表,我得到了:

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

事实上,我有一个2台服务器的集群。它们都可以将数据保存到数据库中。我怀疑这与重新编号的顺序问题有关。因为这个问题。像MyEntity这样的查询anEntity = auditReader.find(MyEntity.class,id,revNum)不起作用,因为 org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:117)。我检查了Hibernate生成的SQL,在where子句

 where
    myentity.rev<=?
    and myentity.revtype<>?
    and myentity.id=?
    and (
        myentity.revend>?
        or myentity.revend is null
    )

因此,对于转号1356,例如,检索多个审计记录 1356 - &gt; 1357和1305 - > 1358因为转数1356正好在两端之间。

我该如何解决这个问题?我的意思是让转数单调增加一个接一个的交易。

更新

我的修订实体

@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;

}

enter image description here

1 个答案:

答案 0 :(得分:1)

您可能希望了解如何在SequenceIdRevisionEntity类中定义修订号序列。我们基本上将其定义如下:

@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,以避免您在现有序列定义中注意到的高低差距。

相关问题