10

我正在使用 spring boot 和 spring data jpa。我也在使用休眠环境,我需要访问 AuditReaderFactory 以便我可以编写审计查询。

因为,它是一个 spring boot 和 spring data jpa,所以一切都是自动配置的。所以当我这样做时,

@Autowired
AuditReaderFactory auditReaderFactory;

它不起作用。我收到以下错误。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.envers.AuditReaderFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency

如何在我的存储库类中获得对 AuditReaderFactory 的正确引用?

4

4 回答 4

7

创建配置类如 AuditConfiguration.java:

import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManagerFactory;

@Configuration
public class AuditConfiguration {

    private final EntityManagerFactory entityManagerFactory;

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

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

之后,您可以AuditReader在组件类中自动装配。

于 2018-08-15T12:10:09.173 回答
4

跟进上述答案和链接问题,我发现这可行。(如果这可以以某种方式直接变成阅读器的自动接线会很好)

@Autowired
private EntityManagerFactory factory;

public void stuff() {
    AuditReader audit = AuditReaderFactory.get(factory.createEntityManager());
}
于 2018-06-06T08:41:46.350 回答
2

AuditReaderFactory 只有两个静态方法。你能自动装配一个 SessionFactory 对象或你的 EntityMananger 吗?看起来两者都可以满足您的需求,即访问 AuditReader。

AuditReaderFactory.get(sessionFactory.getCurrentSession())

如果需要,编辑 这篇文章有一些细节或连接 SessionFactory

于 2016-03-28T20:38:24.717 回答
0

在我看来,@deniss-s 答案(投票最多的一个)是不正确的,因为 EntityManager 不得在事务上下文之外重用(请参阅https://stackoverflow.com/a/9375891/554117),而解决方案将其用作单例。

AuditReader 的正确检索如下所示:

public class AuditRepository {

    @PersistenceContext
    private EntityManager entityManager;

    private AuditReader getAuditReader() {
        return AuditReaderFactory.get(entityManager);
    }
 
     public Optional<T> getRevision() {
         final AuditReader auditReader = getAuditReader();
         ...
    }

}

于 2021-12-01T00:30:05.763 回答