2011-03-06 133 views
4

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

@PersistenceContext private EntityManager entityManager; 

注入实体管理领域的定义。当我做这个春天抛出以下异常:

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

的问题是,实体管理器不能因为注入实体经理工厂正在创建中。

任何想法我该如何解决这个问题?

回答

3

使用取决于上(XML版本):

<bean id="interceptor" 
    class="YourHibernateInterceptor" depends-on="entityManagerFactory"/> 

或者@DependsOn(译注版):

@DependsOn("entityManagerFactory") 
public class YourHibernateInterceptor{ 
    // ... 
} 

参考:


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

this.entityManager = context.getBean(EntityManager.class);