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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2961239/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 23:41:59  来源:igfitidea点击:

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

javahibernatespringjpajunit

提问by user294241

I am using JUnit 4 to test Dao Access with Spring (annotations) and JPA (hibernate). The datasource is configured through JNDI(Weblogic) with an ORacle(Backend). This persistence is configured with just the name and a RESOURCE_LOCAL transaction-type

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

The application context file contains notations for annotations, JPA config, transactions, and default package and configuration for annotation detection. I am using Junit4 like so:

应用程序上下文文件包含注释的注释、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

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);
      }
} 


regardless of what changes I make I get:

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


无论我做了什么改变,我都会得到:

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

Any hint on what this could be. I am running the tests inside eclipse.

关于这可能是什么的任何提示。我正在 eclipse 中运行测试。

回答by skaffman

Your Spring context has a bean definition using LocalContainerEntityManagerFactoryBean. This creates an EntityManagerFactory, not an EntityManager.

您的 Spring 上下文有一个使用LocalContainerEntityManagerFactoryBean. 这将创建一个EntityManagerFactory,而不是一个EntityManager

AssignmentDaoneeds to get itself wired with an EntityManagerFactory.

AssignmentDao需要自己连接一个EntityManagerFactory.

Alternatively, you can replace the LocalContainerEntityManagerFactoryBeanwith a LocalEntityManagerFactoryBean, which willcreate an EntityManagerdirectly. However, you need to be careful with that one, it has some downsides. See that part of the Spring docsfor a full explanation of the options.

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

It's confusing, because the naming conventions of JPA and Spring overlap each other, so naming these classes is a real bugger.

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