【问题标题】:No unique bean of type [javax.persistence.EntityManager] is defined没有定义类型 [javax.persistence.EntityManager] 的唯一 bean
【发布时间】:2010-06-02 20:11:08
【问题描述】:

我正在使用 JUnit 4 通过 Spring(注释)和 JPA(休眠)测试 Dao Access。数据源通过 JNDI(Weblogic) 和 ORacle(Backend) 进行配置。此持久性仅使用名称和 RESOURCE_LOCAL 事务类型进行配置

应用程序上下文文件包含注释、JPA 配置、事务以及用于注释检测的默认包和配置的注释。 我像这样使用 Junit4:


应用程序上下文

<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 中运行测试。

【问题讨论】:

    标签: java hibernate spring jpa junit


    【解决方案1】:

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

    AssignmentDao 需要与EntityManagerFactory 连接。

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

    这很混乱,因为 JPA 和 Spring 的命名约定相互重叠,所以命名这些类是一个真正的错误。

    【讨论】:

    • assignmentDao 是通过注释连接的,即在最后一分钟插入用于调试,忽略。到目前为止,我发现的所有示例都使用配置中的 EntityManagerFactory 和 EntityManager 进行注入。我已经以这种方式将它与 Mysql w/o JUnit-Spring Integration 一起使用,并且它有效。
    • @sebajb:阅读我发布的链接。第 13.5.2 节讨论了以您需要的方式组合事物。
    • 谢谢。我需要阅读文档,看看有什么适合我的需要。然而,LocalEntityManagerFactoryBean 似乎对我的要求太有限了。我将只注入一个 EntityManagerFactory。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2016-05-09
    • 2013-01-11
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多