首页 > 解决方案 > 设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用;

问题描述

我的代码中出现此错误。

org.springframework.beans.factory.BeanCreationException:创建名为“roleRepository”的bean时出错:在设置bean属性“entityManager”时,无法创建类型为[org.springframework.orm.jpa.SharedEntityManagerCreator]的内部bean“(内部bean)#7540dc57” '; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“(内部 bean)#7540dc57”的 bean 时出错:设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available

我看到了这些:

设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用

NoSuchBeanDefinitionException:没有名为“entityManagerFactory”的bean可用

NoSuchBeanDefinitionException:没有定义名为“entityManagerFactory”的bean

他们都没有回答我的问题。问题是我能够解决问题,但我对此有疑问。

让我分享我的相关代码,然后问我有什么问题。

@Configuration
@EnableTransactionManagement 
public class HibernateConfig {

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerF() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[] {"com.gitreporter"});
    JpaVendorAdapter jpaAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(jpaAdapter);
    em.setJpaProperties(jpaProperties());

    return em;
}

@Bean
public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory emf) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(emf);

    return jpaTransactionManager;
}

private final Properties jpaProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

    return properties;
}


@Bean
public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/MyDBNAME?useSSL=false");
    dataSource.setUsername("username");
    dataSource.setPassword("password");

    return dataSource;
}

问题出在这一行:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerF() {

我将方法名称更改为 entityManagerFactory,如下所示:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

使上下文中的工厂 bean 的名称等于“entityManagerFactory”,因为默认情况下,除非明确指定,否则 bean 的名称将等于方法名称。

我的问题:JPA API 中是否有一个地方“按照惯例”在 Spring 容器中寻找名为“entityManagerFactory”的 EntityManagerFactory bean?当方法的名称是“entityManagerF”时,为什么它不起作用?

这是其余的代码:

@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

public List<T> findByAttributeContainsText(String attributeName, String text);

}

public class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
    implements GenericRepository<T, ID> {

private EntityManager entityManager;

public GenericRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
    super(entityInformation, entityManager);
    this.entityManager = entityManager;
 }
}


public interface RoleRepository extends GenericRepository<Role, Long> {

}

标签: javaspringhibernatespring-mvcspring-data-jpa

解决方案


我找到了答案。

查看 @EnableJpaRepositories 注释的文档

在可选元素中,您将看到:

entityManagerFactoryRef 配置 EntityManagerFactory bean 定义的名称,用于创建通过此注释发现的存储库。

转到页面的详细信息,您将看到:

entityManagerFactoryRef

公共抽象字符串 entityManagerFactoryRef

配置 EntityManagerFactory bean 定义的名称,用于创建通过此注释发现的存储库。默认为 entityManagerFactory

回报:

默认值:“实体管理器工厂”

所以这个“常规”的默认配置来自@EnableJpaRepositories 注解本身。


推荐阅读