ash*_*ram 7 java spring-data-jpa spring-boot nhibernate-envers
我正在使用 spring boot 和 spring 数据 jpa。我也在使用 hibernate envers,我需要访问 AuditReaderFactory 以便我可以编写审计查询。
因为它是一个弹簧引导和弹簧数据 jpa,所以一切都是自动配置的。所以当我这样做时,
@Autowired
AuditReaderFactory auditReaderFactory;
Run Code Online (Sandbox Code Playgroud)
它不起作用。我收到以下错误。
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
Run Code Online (Sandbox Code Playgroud)
如何在我的存储库类中正确引用 AuditReaderFactory?
在我看来,@deniss-s 的答案(投票最高的一个)是不正确的,因为 EntityManager 不得在事务上下文之外重用(请参阅/sf/answers/656312401/),而解决方案将其用作单例。
AuditReader 的正确检索如下所示:
public class AuditRepository {
@PersistenceContext
private EntityManager entityManager;
private AuditReader getAuditReader() {
return AuditReaderFactory.get(entityManager);
}
public Optional<T> getRevision() {
final AuditReader auditReader = getAuditReader();
...
}
Run Code Online (Sandbox Code Playgroud)
}
编辑:我刚刚意识到@deniss-s更新了他的答案(可能在阅读我的答案后),但他的答案仍然不正确:AuditReader仍然作为单例创建,而每次都必须创建一个新实例。
继上面的答案和链接的问题之后,我发现这是可行的。(如果可以以某种方式直接将其变成阅读器的自动装配,那就太好了)
@Autowired
private EntityManagerFactory factory;
public void stuff() {
AuditReader audit = AuditReaderFactory.get(factory.createEntityManager());
}
Run Code Online (Sandbox Code Playgroud)
创建 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());
}
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以AuditReader在组件类中自动装配。
AuditReaderFactory 只有两个静态方法。您可以自动装配 SessionFactory 对象或 EntityMananger 吗?看起来两者都可以满足您的需求,即访问 AuditReader。
AuditReaderFactory.get(sessionFactory.getCurrentSession())
Run Code Online (Sandbox Code Playgroud)
编辑 这篇文章有一些细节或如果需要的话接线 SessionFactory
| 归档时间: |
|
| 查看次数: |
4565 次 |
| 最近记录: |