Не удается внедрить Entity Manager во внешний файл JAR - PullRequest
0 голосов
/ 21 февраля 2012

Я нахожусь в процессе разработки отдельного Java-компонента, который будет упакован в виде jar-файла и добавлен в родительский проект. причина сделать это как компонент состоит в том, что завтра мне, возможно, придется удалить этот код и отказаться от него. Проблема, с которой я сталкиваюсь, заключается в том, что отдельный компонент (файл jar), который разрабатывается, должен запрашивать базу данных, когда кто-то вызывает ее API.

Мой родительский проект настроен с использованием Spring + Hibernate + JPA.

Я не могу внедрить EntityManager из родительского проекта во внешний Jar, который создается во время запуска контейнера Spring.

Это концептуально правильно? или это можно сделать таким образом?

Я хочу, чтобы файл jar просто вставлялся в файл persistence.xml, определенный родительским проектом, и использовал EntityManager, который был загружен во время запуска.

EDIT Таким образом, entityManager внедряется через LocalContainerEntityManagerFactoryBean в основное веб-приложение

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceWrapper" />
    <property name="persistenceUnitName" value="LineManagement" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform"  value="${hibernate.dialect}" />
        </bean>
    </property>
    <property name="beanName" value="entityManager"></property>
</bean>

abstractDAO в родительском веб-приложении определяется следующим образом, а аннотация PersistenceContext возвращает EntityManager, и все работает нормально.

public abstract class AbstractDAO<T extends LMEntity> {

   @PersistenceContext(unitName = "LineManagement")
   protected EntityManager entityManager;

   @Autowired
   private DataSource dataSource;

   @Autowired
   private DAOSupport daoSupport;

   public void initHibernateStatistics() {
      HibernateStatistics.enableHibernateStatistics(entityManager);
   }

Ниже приведен DAO в jar-файле, в который я хочу вставить EntityManager, чтобы он мог использовать уже предоставленный

Это DAO в файле jar

@Repository(value = "retryDAO")
public class RetryDAOImpl
  implements RetryDAO {

   @Autowired
   private EntityManager entityManager;

   @Transactional
   public void saveEvent(final IntegrationEvent event) {
      entityManager.merge(event);
   }

Я попробовал аннотацию @Autowired, и там упоминается, что компонент entityManager отсутствует.

1 Ответ

0 голосов
/ 21 февраля 2012

Это возможно, если вы:

  • совместно используете один и тот же контекст Spring между вашим родительским приложением и вашим компонентом
  • или ваш прикладной контекст является родительским для вашего контекста Spring..

Кроме того, вам необходимо убедиться, что Spring фактически создает экземпляр вашего компонента, чтобы он мог внедрить все, что необходимо.Если вы используете конфигурацию на основе аннотаций, это может включать сканирование компонентов (то есть вам нужно будет указать <context:component-scan /> в вашем applicationContext.xml).Если вы используете традиционную конфигурацию XML, <context:annotation-config /> и последующего объявления ваших компонентов персистентности в applicationContext.xml должно быть достаточно.

Что бы определенно не работало, это использование полностью независимых контекстов для вашего родительского приложения и вашего компонентав банке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...