hibernate-envers - Spring Data Envers 实体不能为空
问题描述
假设我们已经审计了具有@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);
这是github测试项目的链接:https ://github.com/aquariusmaster/spring-data-envers-bug
所以我的问题是这是 Spring Data Envers 中的一个错误,还是我错过了配置中的某些内容?
解决方案
正如 spring-data-envers 团队回复的那样,将引导版本升级到 2.3.1.RELEASE 解决了问题: https ://github.com/spring-projects/spring-data-envers/issues/34#issuecomment-651681687
推荐阅读
- blockchain - 使用链上“注释”发布链下项目
- angular - 将数据传递到 Angular Web 组件
- websphere - WebSphere 拓扑.. 2 个节点,每个节点前面都有自己的集群和硬件负载均衡器
- javascript - 我怎样才能使这个返回承诺的函数不阻塞其他代码?
- java - 在Java中将文本文件读入列表
- postgresql - Postgres 数据库还原错误:警告:还原时忽略错误:38 进程返回退出代码 1
- oracle - PLSQL:在给定的机器生成的字符串中获取第 3 # 和第 4 # 之间的单词
- excel - 我怎样才能停止这个 vba 循环?
- ghostscript - 如何在没有字体丢失的情况下将 PDF 转换为图像?
- javascript - 使用“ng-show”进行过滤时,如何在angularJS中获取过滤数据的总长度?