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

Я использую 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.


person user294241    schedule 02.06.2010    source источник


Ответы (1)


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

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

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

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

person skaffman    schedule 02.06.2010
comment
присваивание Dao зашито аннотацией, которая была вставлена ​​в последнюю минуту для отладки, не обращайте внимания. До сих пор все примеры, которые я нашел, использовали EntityManagerFactory в конфигурации и EntityManager для внедрения. Я использовал его таким образом с Mysql без интеграции JUnit-Spring, и это сработало. - person user294241; 03.06.2010
comment
@sebajb: прочитайте ссылку, которую я разместил. В разделе 13.5.2 рассказывается о том, как комбинировать вещи так, как вам нужно. - person skaffman; 03.06.2010
comment
Спасибо. Мне нужно прочитать документ и посмотреть, что мне подходит. Однако LocalEntityManagerFactoryBean кажется слишком ограниченным для моих требований. Вместо этого я просто введу EntityManagerFactory. - person user294241; 03.06.2010