没有定义[javax.persistence.EntityManager]类型的唯一bean

时间:2010-06-02 20:11:09

标签: java hibernate spring jpa junit

我正在使用JUnit 4来测试Dao Access with Spring(注释)和JPA(hibernate)。数据源通过JNDI(Weblogic)配置ORacle(后端)。此持久性仅使用名称和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" />

<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 TestCase


不管我得到什么改变:
@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); } }

任何暗示这可能是什么。我在eclipse里面运行测试。

1 个答案:

答案 0 :(得分:2)

您的Spring上下文使用LocalContainerEntityManagerFactoryBean进行bean定义。这会创建EntityManagerFactory,而不是EntityManager

AssignmentDao需要使用EntityManagerFactory连接。

或者,您可以将LocalContainerEntityManagerFactoryBean替换为LocalEntityManagerFactoryBean直接创建EntityManager。但是,你需要小心那个,它有一些缺点。有关选项的完整说明,请参阅Spring docs的该部分。

令人困惑,因为JPA和Spring的命名约定相互重叠,因此命名这些类是一个真正的错误。