0

假设我们已经审计了具有@OneToOne 关系的实体:

@Entity
@Audited
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "active")
    private boolean active;
    @OneToOne(mappedBy="product", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    private ProductPrice productPrice;
}

@Audited
@Entity
@Table(name = "product_price")
public class ProductPrice {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @Column(name = "amount")
    private Long amount;
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id", nullable = false)
    private Product product;
}

和 RevisionService 具有获取修订和查找更改的方法:

@Transactional
public Page<Revision<Long, Product>> getGroupRevisions(Long productId, int page) {
    Page<Revision<Long, Product>> revisions = productRepository.findRevisions(productId, PageRequest.of(page, 5, RevisionSort.desc()));
    Long priceId = revisions.getContent().get(0).getEntity().getProductPrice().getId();
    Page<Revision<Long, ProductPrice>> priceRevisions = productPriceRepository.findRevisions(priceId, PageRequest.of(page, 5, RevisionSort.desc()));
    return revisions;
}

现在,如果我创建新的 Product 和 ProductPrice 记录,然后对 Product 进行 5 次以上的更改(将生成 5 个 RevInfo 记录),我会得到异常:

java.lang.IllegalArgumentException: Entity must not be null!
    at org.springframework.util.Assert.notNull(Assert.java:198)
    at org.springframework.data.history.AnnotationRevisionMetadata.<init>(AnnotationRevisionMetadata.java:55)
    at org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.getRevisionMetadata(EnversRevisionRepositoryImpl.java:237)
    at org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.lambda$toRevisions$1(EnversRevisionRepositoryImpl.java:223)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1837)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.toRevisions(EnversRevisionRepositoryImpl.java:226)
    at org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.getEntitiesForRevisions(EnversRevisionRepositoryImpl.java:196)
    at org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.findRevisions(EnversRevisionRepositoryImpl.java:163)

调试后,我看到这个“null”实体被 Hibernate 代理,而 Spring Data envers 在这一点上无法解析修订号: Number revNo = this.enversService.getRevisionInfoNumberReader().getRevisionNumber(revision);

当时的 PersistentContext

这是github测试项目的链接:https ://github.com/aquariusmaster/spring-data-envers-bug

所以我的问题是这是 Spring Data Envers 中的一个错误,还是我错过了配置中的某些内容?

4

1 回答 1

0

正如 spring-data-envers 团队回复的那样,将引导版本升级到 2.3.1.RELEASE 解决了问题: https ://github.com/spring-projects/spring-data-envers/issues/34#issuecomment-651681687

于 2020-07-03T15:33:42.467 回答