我使用Envers来审核我的实体。使用的DB是Oracle 11g。对于修订实体的修订号,我使用了oracle序列。但是由于oracle序列不能保证每次调用nextval的单调增加,在我的修订表中,我得到了类似的东西,
我们可以看到转数不是单调增加的。在我的实体的审计表中,我有这个:
通过将记录与转号一起链接以形成时间表,我得到了:
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;
}
答案 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_value
和increment_size
定义为1
,以避免您在现有序列定义中注意到的高低差距。