JPA没有定义[javax.persistence.EntityManagerFactory]类型的限定bean

时间:2016-06-07 15:58:52

标签: spring jpa

我在Tomcat 8上部署了一个JPA / spring / hibernate应用程序。但是当tomcat服务器启动时,我可以看到这个警告消息"没有定义类型为[javax.persistence.EntityManagerFactory]的限定bean" 。我将不胜感激,因为我不知道配置错误。

的persistence.xml

<persistence-unit name="persistenceUnit"
    transaction-type="RESOURCE_LOCAL">
...

弹簧上下文文件被定义为多个文件以便重用

上下文ds.xml中

<bean id="entityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="datasource" />
    <property name="persistenceUnitName" value="persistenceUnit" />
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManager" />
</bean>
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
...

上下文config.xml中

<context:annotation-config />
<context:component-scan base-package="com.app" />
<jpa:repositories base-package="com.app" />
<tx:annotation-driven transaction-manager="txManager"
    order="200" />

和web.xml

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/context-config.xml, /WEB-INF/context-ds.xml, /WEB-INF/context-dao.xml</param-value>
</context-param>

和DAO抽象类定义PersistenceContext批注

@PersistenceContext
protected EntityManager entityManager;

真实消息

11:45:18.710 [localhost-startStop-1] WARN  AbstractBeanFactory.getTypeForFactoryBean - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myDAO' defined in ServletContext resource [/WEB-INF/context-dao.xml]: Cannot create inner bean 'genericDao$child#632cb33' of type [com.app.dao.GenericDaoImpl] while setting bean property 'target'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'genericDao$child#632cb33': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined

如果我像这样声明PersistenceContext,我会得到消息No bean named&#39; persistenceUnit&#39;已定义

@PersistenceContext(unitName="persistenceUnit")
protected EntityManager entityManager;

1 个答案:

答案 0 :(得分:0)

你必须在一个@Configuration注释类中定义一个像这样的bean ...和你的ref相应的名字

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    LocalContainerEntityManagerFactoryBean factory = null;
    try {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setShowSql(true);

        vendorAdapter.setDatabasePlatform(MyAppSettings.getDbPlattform());

        HibernateJpaDialect jpd = new HibernateJpaDialect();
        factory = new LocalContainerEntityManagerFactoryBean();

        factory.setJpaDialect(jpd);
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan(MyAppSettings.packagesToScan);
        factory.setDataSource(MyDataSource());

    } catch (SQLException e) {
        e.printStackTrace();
    }

    return factory;
}

编辑:

也许你的spring config xml不包含在组件扫描中 试试:

@ImportResource("classpath:spring-config.xml")

....请发布你的完整stacjtrace ..