【问题标题】:No bean named 'entityManagerFactory' is defiend, bean reference issue没有定义名为“entityManagerFactory”的bean,bean引用问题
【发布时间】:2014-05-27 09:58:22
【问题描述】:

我正在使用spring-framework 4.0.2.RELEASEhibernate-3.6.4.Final

这个spring数据jpa配置给我报错:

No bean named 'entityManagerFactory' is defiend.  

但是我发现如果我把bean名字emf改成entityManagerFactory那么就没有问题了。

有人能解释一下为什么 bean 引用在这里不起作用吗?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <!-- http://drypot.com/post/95?p=6 spring + hibernate: with JPA -->

    <tx:annotation-driven />

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >

        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.user}" />
        <property name="password" value="${jdbc.password}" />

    </bean>

    <bean id="emf"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:packagesToScan="${entitymanager.packagesToScan}" >
        <property name="dataSource" ref="dataSource" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <!-- validate | update | create | create-drop -->
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <!--prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop-->

                <!-- hibernate ehcache
                    http://stackoverflow.com/questions/5270998/spring-hibernate-ehcache
                 --> 
                <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
                <prop key="hibernate.cache.factory_class">${hibernate.cache.factory_class}</prop>

            </props>
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="emf" />
    </bean>

</beans>

【问题讨论】:

  • Spring Data JPA 默认查找名为 entityManagerFactory 的 bean。如果您有另一个 bean 名称,请告诉 Spring Data JPA(或简单地重命名您的 bean)。
  • @M.Deinum,我想我是这样说的 &lt;property name="entityManagerFactory" ref="emf" /&gt; 但是它不起作用。
  • 在某个地方有一个 bean、配置部分等需要该 bean,但没有完整的配置,或者至少没有很难确定的实际堆栈跟踪(而不仅仅是消息)。使用 Spring Data Jpa 时,您需要将对 emf 的引用放入 &lt;jpa:repositories /&gt; 元素(或 EnableJpaRepository 注释,默认情况下需要一个名为 entityManagerFactory 的 bean)。
  • @M.Deinum,谢谢我得到提示。

标签: spring jpa spring-data


【解决方案1】:

在使用 Spring Data JPA 时,默认情况下,它会查找名为 entityManagerFactory 的 bean。这是基于 xml 命名空间的配置 (&lt;jpa:repositories /&gt;) 和基于 java 的配置 (@EnableJpaRepositories) 的默认设置。

如果您有一个具有其他名称的 bean,则必须向 Spring Data JPA 说明,以便它可以选择正确的 EntityManagerFactory 来使用。

<task:repositories entity-manager-factory-ref="emf" />

或java配置

@EnableJpaRepositories(entityManagerFactoryRef="emf")

链接

  1. Spring Data JPA reference guide
  2. @EnableJpaRepositories javadoc

【讨论】:

【解决方案2】:

尝试注入您的 EntityManagerFactory,指定您的 bean 的名称,如下所示:

@Autowired
@Qualifier(value = "emf")
private EntityManagerFactory entityManagerFactory;

【讨论】:

  • 感谢您的回答,但是我没有直接在代码中使用EntityManagerFactory。我只是使用 Spring-Data-JPA 的Repository
  • 对于注入EntityManagerFactory,建议使用@PersistenceContext 而不是@Autowired
猜你喜欢
  • 2014-02-26
  • 2015-04-17
  • 2020-03-19
  • 2013-11-19
  • 2018-11-07
  • 1970-01-01
  • 2020-10-23
  • 2021-07-08
  • 2021-03-18
相关资源
最近更新 更多