java - 没有名为 'entityManagerFactory' 的可用 bean,但已设置entityManagerFactoryRef

标签 java spring hibernate jpa spring-data

我正在尝试配置两个 H2 数据源。我尝试了十几个教程,但仍然不起作用。现在我有两个配置类

一、默认配置:

@Configuration
@EnableJpaRepositories(
    basePackages = "com.yyy.xxx.repository",
    entityManagerFactoryRef = "defaultEntityManagerFactory",
    transactionManagerRef = "defaultTransactionManager")
@EnableTransactionManagement
public class DefaultJpaConfiguration {

    private final JpaVendorAdapter jpaVendorAdapter;

    public DefaultJpaConfiguration(JpaVendorAdapter jpaVendorAdapter) {
        this.jpaVendorAdapter = jpaVendorAdapter;
    }

    @Bean(name = "defaultDataSource")
    @ConfigurationProperties(prefix = "datasource.default")
    public DataSource defaultDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "defaultEntityManagerFactory")
    public EntityManagerFactory defaultEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(defaultDataSource());
        lef.setJpaVendorAdapter(jpaVendorAdapter);
        lef.setPackagesToScan("com.yyy.xxx.entity");
        lef.setPersistenceUnitName("defaultPersistenceUnit");
        lef.afterPropertiesSet();
        return lef.getObject();
    }

    @Bean(name = "defaultTransactionManager")
    public PlatformTransactionManager defaultTransactionManager() {
        return new JpaTransactionManager(defaultEntityManagerFactory());
    }

    @Bean(name = "defaultEntityManager")
    public EntityManager defaultEntityManager() {
        return defaultEntityManagerFactory().createEntityManager();
    }

}

第二个:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.yyy.xxx.adminPassword.repository",
        entityManagerFactoryRef = "passwordEntityManagerFactory",
        transactionManagerRef = "passwordTransactionManager")
public class PlkPasswordsDatabaseConfiguration {

    private final JpaVendorAdapter jpaVendorAdapter;

    public PlkPasswordsDatabaseConfiguration(JpaVendorAdapter jpaVendorAdapter) {
        this.jpaVendorAdapter = jpaVendorAdapter;
    }

    @Bean(name = "passwordDataSource")
    @ConfigurationProperties(prefix = "datasource.adminPasswords")
    public DataSource passwordDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "passwordEntityManagerFactory")
    public EntityManagerFactory passwordEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(passwordDataSource());
        lef.setJpaVendorAdapter(jpaVendorAdapter);
        lef.setPackagesToScan("com.yyy.xxx.adminPassword.entity");
        lef.setPersistenceUnitName("passwordPersistenceUnit");
        lef.afterPropertiesSet();
        return lef.getObject();
    }

    @Bean(name = "passwordEntityManager")
    public EntityManager passwordEntityManager() {
        return passwordEntityManagerFactory().createEntityManager();
    }

    @Bean(name = "passwordTransactionManager")
    public PlatformTransactionManager passwordTransactionManager() {
        return new JpaTransactionManager(passwordEntityManagerFactory());
    }

}

属性文件:

datasource.default.url=jdbc:h2:mem:xxx_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
datasource.default.username=sa
datasource.default.password=

datasource.adminPasswords.url=jdbc:h2:mem:xxx_plk_passwords_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
datasource.adminPasswords.username=sa
datasource.adminPasswords.password=

我得到的错误是:

由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“entityManagerFactory”的可用 bean

但是正如您在配置类中看到的那样,entityManagerFactoryRef 已设置。

最佳答案

当您有多个数据源、EntityManager 和 PlatformTransactionManager 时,Spring 希望您指定其中哪一个是主要数据源。在数据源、entitymanager 和 transactionmanager(无论是哪一个)bean 之一上添加 @Primary

关于java - 没有名为 'entityManagerFactory' 的可用 bean,但已设置entityManagerFactoryRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43844334/

相关文章:

java - 我如何从 Hibernate Exception 中提取 constraintName

java - Hibernate自动增量序列在删除和插入后丢失

java - Azure AD 从 .auth/me 获取 Java JSP API 中当前登录的用户

java - 片段内的组件从未激活

java - 将jar转换为exe

java - 无法转换为内部表示

java - java程序中的代理设置

java - Spring:同一类的多个 Controller 实例

spring - 特定日期的 Cron 表达式

java - 如何解决来自2个不同jar的相同类之间的冲突?