如何使用 Spring 在 Hibernate Interceptor Bean 中注入 EntityManager?

Gui*_*oMB 4 java spring hibernate dependency-injection jpa

我需要创建一个必须有权访问实体管理器的 Hibernate 拦截器。问题是,当我定义如何使用 Spring 中的 XML 配置文件创建 EntityManagerFactory 以定义 entityManagerFactory bean 时,我必须告诉实体管理它必须使用哪个拦截器 bean。问题是我的拦截器 bean 具有使用定义的注入实体管理器字段

@PersistenceContext private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,Spring 会引发以下异常:

引起:org.springframework.beans.factory.BeanCreationException:创建名为“ar.com.zauber.commons.repository.utils.ConfigurableHibernatePersistence#50d17ec3”的bean时出错,定义在类路径资源[ar/com/xxx/impl/config /persistence/persistence-impl-xxx-spring.xml]:在设置 bean 属性“拦截器”时无法解析对 bean“拦截器”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“拦截器”的 bean 时出错:持久依赖注入失败;嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为“entityManagerFactory”的 bean 时出错:当前正在创建的 FactoryBean 从 getObject 返回 null

问题是无法注入实体管理器,因为正在创建实体管理器工厂。

知道如何解决这个问题吗?

Sea*_*oyd 5

使用依赖(XML 版本):

<bean id="interceptor"
    class="YourHibernateInterceptor" depends-on="entityManagerFactory"/>
Run Code Online (Sandbox Code Playgroud)

@DependsOn(注解版):

@DependsOn("entityManagerFactory")
public class YourHibernateInterceptor{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

参考:


如果这不起作用,因为它是一个鸡/蛋问题(EntityManagerFactory 取决于 SessionFactory,SessionListener 取决于 EntityManagerFactory,您可以将您的 SessionListener 标记为ApplicationContextAwareApplicationListener<ContextRefreshedEvent>并手动连接EntityManager

this.entityManager = context.getBean(EntityManager.class);
Run Code Online (Sandbox Code Playgroud)