【问题标题】:How to access AuditReaderFactory in spring boot application?如何在 Spring Boot 应用程序中访问 AuditReaderFactory?
【发布时间】:2016-07-15 11:54:21
【问题描述】:

我正在使用 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?

【问题讨论】:

    标签: java spring-boot spring-data-jpa nhibernate-envers


    【解决方案1】:

    创建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

    【讨论】:

      【解决方案2】:

      在我看来,@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();
               ...
          }
      

      }

      【讨论】:

        【解决方案3】:

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

        @Autowired
        private EntityManagerFactory factory;
        
        public void stuff() {
            AuditReader audit = AuditReaderFactory.get(factory.createEntityManager());
        }
        

        【讨论】:

        • 我认为使用 @PersistenceContext 注释连接 EntityManager 会更干净
        【解决方案4】:

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

        AuditReaderFactory.get(sessionFactory.getCurrentSession())
        

        编辑 this 帖子有一些细节或必要时连接 SessionFactory

        【讨论】:

        • 以下链接到自动装配 SessionFactory,这不起作用;可以创建和保存实体,仍然无法获取 AuditReaderFactory: (spring 1.5, hibernate 5.2.1) org.hibernate.HibernateException: No CurrentSessionContext configured!
        猜你喜欢
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 2021-05-24
        • 2015-07-17
        • 2021-06-22
        • 2019-07-25
        相关资源
        最近更新 更多