java - 未定义 [javax.persistence.EntityManager] 类型的唯一 bean

标签 java hibernate spring jpa junit

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

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

<小时/>

应用程序上下文

<pre><code><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" /> </code></pre>

<小时/>

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


无论我做出什么改变,我都会得到:
<br/> <b>No unique bean of type [javax.persistence.EntityManager] is defined</b>

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

最佳答案

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

AssignmentDao 需要将自身与 EntityManagerFactory 连接起来。

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

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

关于java - 未定义 [javax.persistence.EntityManager] 类型的唯一 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2961239/

相关文章:

java - Intellij Idea kotlin 无法自动导入某些运算符函数,例如 +

java - 从 html 文件读取 json 数组并在 servlet 中打印值

java - Hibernate Join 使用条件和限制

java - 如何访问 HQL 中的枚举属性?

java - 如何将数据更新到主存?

java - 为什么这个 for 循环会给出空指针异常?

java - 如何使用 Hibernate eqOrIsNull()

java - Spring:如何在RESTful服务中为@RequestBody添加XSS保护?

Java Spring Patch RFC-6902 即时类型转换异常

java - Eclipse JSP 预览