首页 > 解决方案 > Hibernate Envers:Autowired AuditReader 共享一级缓存

问题描述

在某些审计实体引用的非审计实体发生更改后,Hibernate envers 似乎不会更新一级缓存。

我有以下两个实体:

@Entity 
@Audited
public class A {
    // ...  
    @ManyToMany(cascade = CascadeType.PERSIST)
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    private Collection<B> references = new ArrayList<>();
}
@Entity 
public class B {
    // ...
    private boolean enabled;
}

我还有以下数据a1 = {'references' : [b1]}b1.enabled = true。即,我有一个 A 类 (a1) 实例和一个 B 类 (b1) 实例,该实例当前已启用。

当我在特定版本中加载 a1 时,数据被加载到 envers 缓存中。但是在我修改 b1 (b1.enabled = false) 之后,“旧”引用保留在缓存中,尽管 b1 是/不应该被审计。

实体的当前版本 (b1),以及 envers 中的缓存版本:https ://i.stack.imgur.com/FoSWQ.png

编辑:我假设会话没有关闭并且审计阅读器保持会话打开。我在spring boot中有以下配置:

@Configuration
public class AuditConfiguration {

    private final EntityManagerFactory entityManagerFactory;

    AuditConfiguration(EntityManagerFactory entityManagerFactory) {
        this.entityManagerFactory = entityManagerFactory;
    }

    @Bean
    AuditReader auditReader() {
        return AuditReaderFactory.get(entityManagerFactory.createEntityManager());
    }
}

从新会话创建新的 AuditReader 后,数据返回正确。我真的需要创建一个新的(新的)AuditReader 以便在 Spring Boot 中不共享一级缓存,还是有其他方法?

标签: spring-boothibernatespring-data-jpahibernate-envers

解决方案


推荐阅读