我正在使用 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/