【问题标题】:JPA No qualifying bean of type [javax.persistence.EntityManagerFactory] is definedJPA 没有定义 [javax.persistence.EntityManagerFactory] ​​类型的限定 bean
【发布时间】:2016-06-07 15:58:51
【问题描述】:

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

persistence.xml

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

spring 上下文文件为了可重用性被定义为多个文件

上下文-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" >
...

上下文配置.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 'persistenceUnit' is defined

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

【问题讨论】:

    标签: spring jpa


    【解决方案1】:

    你必须在 @Configuration 注释类中定义一个像这样的 bean...并根据你的参考命名它

    @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 配置 xml 没有包含在组件扫描中 试试:

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

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

    【讨论】:

    • 不,对 LocalContainerEntityManagerFactoryBean 类的唯一引用是在 config-ds.xml 中,它与您的配置相同
    • 其他参数在persistence.xml文件中指定(提供者、要扫描的jar和属性)。
    • 这是一条警告消息,但应用程序没有启动。我修改了问题以包含它。谢谢。
    • 当我们使用多个spring配置文件时,组件扫描的范围是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2014-09-03
    • 1970-01-01
    • 2015-02-01
    • 2014-07-29
    相关资源
    最近更新 更多