Andrii Bobrov
Andrii Bobrov

Reputation: 79

Spring Data Envers Entity must not be null

Suppose we have audited entities with @OneToOne relation:

@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;
}

And RevisionService with the method to get revisions and find changes:

@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;
}

Now, If I create new Product and ProductPrice records and then make changes into Product more then 5 times (5 RevInfo records would generated), I get exception:

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)

After debugging I saw that this "null" entity was proxied by Hibernate and Spring Data envers could not resolve revision number in this point: Number revNo = this.enversService.getRevisionInfoNumberReader().getRevisionNumber(revision);

PersistentContext at that time

Here is the link to github test project: https://github.com/aquariusmaster/spring-data-envers-bug

So my question is this a bug in Spring Data Envers or I miss something in the configuration?

Upvotes: 1

Views: 1237

Answers (1)

Andrii Bobrov
Andrii Bobrov

Reputation: 79

As spring-data-envers team replied, upgrading boot version to 2.3.1.RELEASE solve the problem: https://github.com/spring-projects/spring-data-envers/issues/34#issuecomment-651681687

Upvotes: 0

Related Questions