猿问

使用休眠环境时,AUD 表中的所有 @Version 字段都为空,但在实体 - 表中填充好吗?

有应用程序 spring+jpa+envers(hibernate) envers 需要在特殊表中保存实体的历史记录。


在我保存了几次我的实体后,我希望在 USER 表中看到填充的版本字段,并在 USER_AUT 中看到填充的版本字段。但实际结果是 USER 表中的正确值,但添加了 REV_TYPE、REV 列(在字段中只是所有行的 couter)和版本列中的 null。


我使用 4.0.1.Final 休眠


<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-envers</artifactId>

    <version>4.0.1.Final</version>

</dependency>

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-entitymanager</artifactId>

    <version>4.0.1.Final</version>

</dependency>

但是,当我查看表格时,版本字段中的所有值都是空的


我的实体是


import lombok.*;

import org.hibernate.annotations.GenericGenerator;

import org.hibernate.envers.Audited;


import javax.persistence.*;


@Entity

@Audited

@Table(name = "User", uniqueConstraints = {

        @UniqueConstraint(columnNames = { "prKey"})})

@NoArgsConstructor(access = AccessLevel.PUBLIC)

@AllArgsConstructor

@Getter

@Setter

public class User {

    @Id

    @GeneratedValue(generator = "uuid")

    @GenericGenerator(name = "uuid", strategy = "uuid2")

    @Column(name = "PR_KEY", unique = true)

    private String prKey;


    @Column(name = "name", length = 100, unique = false)

    private String name;


    @Version

    private int version;


    public User(String name){

        this.name = name;

    }

}

当我使用审计获取实体时:


 public List<User> getHistory(String id) {

        AuditReader auditReader = AuditReaderFactory.get(entityManagerFactory.createEntityManager());


        List<Number> auditVersions = auditReader.getRevisions(User.class, id);

        List<User> users = auditVersions.stream().map(item -> auditReader.find(User.class, id, item.intValue())).collect(Collectors.toList());


        return extractRiskMetrics(riskMetricRecords);

    }


摇曳的蔷薇
浏览 181回答 2
2回答

qq_花开花谢_0

看配置设置org.hibernate.envers.do_not_audit_optimistic_locking_field。此配置设置控制 Hibernate Envers 是否将@Version在审计模式中包含带注释的字段。默认情况下,该设置设置为true这意味着不会审核乐观锁定字段。通过将此设置为false,您将审核列的值。我确实想提醒您将此字段设置为false.如果您的应用程序执行显式乐观锁定增量功能,这将导致将额外的行添加到审计历史表中,即使在您的业务流程中没有更改任何其他数据库列。这是因为一旦启用@Version要跟踪的字段,Hibernate Envers 就会简单地将它们视为实体上的任何其他基本属性。因此,强制乐观锁增量将触发审计更改。

动漫人物

正如您所提到的 - REVINFO 是所有被审计实体的集中表。下面介绍的基本思想是将修订号重新映射到整数序列 - 因此 RevNumber(2,5,31,125) 将重新映射到 customVersion(1,2,3,4)假设您有EntityA并且您想要为其获取所有版本(并将每个版本数据映射到自定义类RevisionEntityDto)。使用AuditReader来自 Envers,您可以执行以下操作:AuditReader auditReader = AuditReaderFactory.get(entityManager);//getRevisions() returns revisions sorted in ascending order (older revisions come first)List<Number> entityARevisions = auditReader.getRevisions(EntityA.class, primaryKeyOfEntityA);//entityARevisions is already sorted;for (int customVersion = 0; customVersion < entityARevisions.size(); customVersion++) {&nbsp; &nbsp;createRevisionEntityDto(primaryKeyOfEntityA, auditReader, revision, customVersion);}private RevisionEntityDto createRevisionEntityDto(Long primaryKeyOfEntityA, AuditReader, Number revision) {&nbsp; EntityA revisionOfEntityA = auditReader.find(EntityA.class, primaryKey, revision);&nbsp; Date revDate = auditReader.getRevisionDate(revision);&nbsp; // at this point you have a single revision of EntityA&nbsp; return toRevisionEntityDto(revision, revisionOfEntityA, revDate);}private RevisionEntityDto toRevisionEntityDto(Number revision, EntityA revisionOfEntityA, Date revisionDate, int customVersion) {&nbsp; //here you do the mapping logic;&nbsp; RevisionEntityDto revEntityDto = new RevisionEntityDto();&nbsp; revEntityDto.setFieldA(revisionOfEntityA.getFieldA);&nbsp; revEntityDto.setDate(revisionDate); // you can use the date to sort if you want at a later stage;&nbsp; revEntityDto.setCustomVersion(customVersion);&nbsp; return revEntityDto;}
随时随地看视频慕课网APP

相关分类

Java
我要回答