【问题标题】:Hibernate Envers revision number orderHibernate Envers 修订号顺序
【发布时间】: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


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

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多