Как внедрить EntityManager в Hibernate Interceptor Bean с помощью Spring? - PullRequest
4 голосов
/ 07 марта 2011

Мне нужно создать перехватчик Hibernate, который должен иметь доступ к диспетчеру сущностей. Проблема в том, что когда я определяю, как будет создаваться EntityManagerFactory, используя XML-файл конфигурации в Spring для определения bean-объекта entityManagerFactory, я должен сообщить объекту управления, какой компонент-перехватчик он должен использовать. Дело в том, что мой бин-перехватчик имеет введенное поле менеджера сущностей, определенное с помощью

@PersistenceContext private EntityManager entityManager;

Когда я делаю это Spring, выдает следующее исключение:

Вызвано: org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'ar.com.zauber.commons.repository.utils.ConfigurableHibernatePersistence # 50d17ec3', определенного в ресурсе пути к классу [ar / com / xxx / impl / config / persistence / persistence-impl-xxx-spring.xml]: не удается разрешить ссылку на bean-компонент-перехватчик при установке свойства bean-компонента interceptor; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'interceptor': не удалось добавить зависимости персистентности; вложенное исключение - org.springframework.beans.factory.BeanCurrentlyInCreationException: ошибка создания бина с именем entityManagerFactory: FactoryBean, который в данный момент находится в процессе создания, возвратил ноль из getObject

Проблема в том, что менеджер сущностей не может быть введен, поскольку создается фабрика менеджера сущностей.

Есть идеи, как решить эту проблему?

1 Ответ

4 голосов
/ 07 марта 2011

Использование зависит от (версия XML):

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

Или @DependsOn (версия аннотации):

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

Ссылка:


Если это не работает, потому чтоэто проблема курицы / яйца (EntityManagerFactory зависит от SessionFactory, SessionListener зависит от EntityManagerFactory, вы можете пометить свой SessionListener как ApplicationContextAware или ApplicationListener<ContextRefreshedEvent> и вручную подключить EntityManager:

this.entityManager = context.getBean(EntityManager.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...