我正在尝试配置两个 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/