Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Уникальный bean-компонент типа [javax.persistence.EntityManager] не определен

Автор вопроса: user294241Ответов: 1

Я использую JUnit 4 для тестирования Dao Access с помощью Spring (аннотации) и JPA (спящий режим). Источник данных настраивается через JNDI (Weblogic) с ORacle (Backend). Это постоянство настраивается только с именем и типом транзакции RESOURCE_LOCAL.

Файл контекста приложения содержит обозначения для аннотаций, конфигурацию JPA, транзакции, а также пакет по умолчанию и конфигурацию для обнаружения аннотаций. Я использую Junit4 так:


ApplicationContext

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
     <property name="persistenceUnitName" value="workRequest"/>
     <property name="dataSource" ref="dataSource" />
     <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
             <property name="databasePlatform" value="${database.target}"/>
             <property name="showSql" value="${database.showSql}" />
             <property name="generateDdl" value="${database.generateDdl}" />
         </bean>
     </property>
</bean>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>workRequest</value>
    </property>
    <property name="jndiEnvironment">
        <props>
            <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
            <prop key="java.naming.provider.url">t3://localhost:7001</prop>
        </props>
    </property>
</bean>

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

Тестовый пример JUnit

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class AssignmentDaoTest {
      private AssignmentDao assignmentDao;
      @Test
      public void readAll() {
            assertNotNull("assignmentDao cannot be null", assignmentDao);
            List<Assignment> assignments = assignmentDao.findAll();
            assertNotNull("There are no assignments yet", assignments);
      }
}


независимо от того, какие изменения я делаю, я получаю:

No unique bean of type [javax.persistence.EntityManager] is defined

Любой намек на то, что это может быть. Я запускаю тесты внутри eclipse.

javaspringhibernatejunitjpa

Ответы

Ответ 1 · рейтинг 2 · skaffman

В вашем контексте Spring есть определение bean-компонента, использующее LocalContainerEntityManagerFactoryBean. Это создает EntityManagerFactory, а не EntityManager.

AssignmentDao необходимо подключиться к EntityManagerFactory.

Кроме того, вы можете заменить LocalContainerEntityManagerFactoryBean на LocalEntityManagerFactoryBean, что будет напрямую создавать EntityManager. Однако с ним нужно быть осторожным, у него есть некоторые недостатки. См. часть Spring docs для полного объяснения параметров.

Это сбивает с толку, потому что соглашения об именах JPA и Spring накладываются друг на друга, поэтому именование этих классов - настоящая ошибка.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы