【发布时间】:2018-01-08 16:47:19
【问题描述】:
我使用 Envers 来审计我的实体。使用的数据库是 Oracle 11g。对于修订实体的修订号,我使用了 oracle 序列。但是由于 oracle 序列不能保证每次调用 nextval 的单调递增,在我的修订表中,我得到了这样的东西,
我们可以看到转速不是单调递增的。在我实体的审计表中,我有这个:
通过将记录与版本号链接在一起形成一个时间线,我得到了:
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
)
所以对于 rev 号 1356,检索了几条审计记录,例如 1356 --> 1357 和 1305 -->1358 因为 rev num 1356 就在两端之间。
我该如何解决这个问题?我的意思是让rev数单调增加一笔交易。
更新
我的修订实体
@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;
}
【问题讨论】:
-
您是在使用所有默认的 envers 配置设置,还是在自定义其中的任何一个?如果您正在自定义某些内容,请更新您的帖子以包含这些内容。
-
@Naros 我已经用我的修订实体类更新了这个问题。你知道如何调整我的课程吗?
-
你试过在
@SequenceGenerator注解上指定allocationSize=1吗?
标签: oracle hibernate hibernate-envers