gpt4 book ai didi

mysql - @Qualifier 不能在 Spring Boot 中使用多个 DataSource bean

转载 作者:行者123 更新时间:2023-11-29 01:02:45 25 4
gpt4 key购买 nike

我在这里尝试使用四个 JPA 实体管理器为 spring boot 应用程序设置四个 MySQL 数据源。我是 spring 和 spring boot 的新手。我在谷歌上搜索了这个以获得线索,但结果非常困惑,有大量的配置方法(但不是用于处理多数据源),我不确定要遵循什么。最后,我试图为每个 MySQL 数据源设置四个独立的实体管理器,并在事务中单独使用它们。

application.properties

# Database Properties
db.driver: com.mysql.jdbc.Driver
db.urlHotelPos: jdbc:mysql://localhost:3306/hotelwebpos
db.urlHotelFinance: jdbc:mysql://localhost:3306/hotelfinance
db.urlHotelInventory: jdbc:mysql://localhost:3306/hotelinventory
db.urlReservation: jdbc:mysql://localhost:3306/reservation
db.username: user
db.password: passwd

# Hibernate Properties
hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql: true
hibernate.hbm2ddl.auto: update
entitymanager.packagesToScan: com.test.poswebservice.model.*

DBconfigs.java

@Configuration
@EnableTransactionManagement
public class DBconfigs {

@Bean
public DataSource dataSourceHotelPos() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlHotelPos"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}

@Bean
public DataSource dataSourceHotelFinance() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlHotelFinance"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}

@Bean
public DataSource dataSourceHotelInventory() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlHotelInventory"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}

@Bean
public DataSource dataSourceReservation() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlReservation"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}

@Bean
@Qualifier("dataSourceHotelPos")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryHotelPos() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

entityManagerFactory.setDataSource(dataSourceHotelPos());

entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);

Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);

return entityManagerFactory;
}

@Bean
@Qualifier("dataSourceHotelFinance")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryHotelFinance() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

entityManagerFactory.setDataSource(dataSourceHotelFinance());

entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);

Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);

return entityManagerFactory;
}

@Bean
@Qualifier("dataSourceHotelInventory")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryHotelInventory(){
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

entityManagerFactory.setDataSource(dataSourceHotelInventory());

entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);

Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);

return entityManagerFactory;
}

@Bean
@Qualifier("dataSourceReservation")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryReservation() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

entityManagerFactory.setDataSource(dataSourceReservation());

entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);

Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);

return entityManagerFactory;
}

@Bean
@Qualifier("entityManagerFactoryHotelPos")
public JpaTransactionManager transactionManagerHotelPos() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryHotelPos().getObject());
return transactionManager;
}

@Bean
@Qualifier("entityManagerFactoryHotelFinance")
public JpaTransactionManager transactionManagerHotelFinance() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryHotelFinance().getObject());
return transactionManager;
}

@Bean
@Qualifier("entityManagerFactoryHotelInventory")
public JpaTransactionManager transactionManagerHotelInventory() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryHotelInventory().getObject());
return transactionManager;
}

@Bean
@Qualifier("entityManagerFactoryReservation")
public JpaTransactionManager transactionManagerReservation() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryReservation().getObject());
return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}

@Autowired
private Environment env;
}

输出>>

***************************
APPLICATION FAILED TO START
***************************

Description:

Method entityManagerFactoryHotelPos in com.test.poswebservice.configs.DBconfigs required a single bean, but 4 were found:
- dataSourceHotelPos: defined by method 'dataSourceHotelPos' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
- dataSourceHotelFinance: defined by method 'dataSourceHotelFinance' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
- dataSourceHotelInventory: defined by method 'dataSourceHotelInventory' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
- dataSourceReservation: defined by method 'dataSourceReservation' in class path resource [com/test/poswebservice/configs/DBconfigs.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

@Qualifier 注释应该可以避免这个问题,但在这里它以某种方式不起作用。我在这里做错了什么?请有人帮助我,这几乎要了我的命:-(任何帮助将不胜感激。

谢谢。

最佳答案

在我的设置中,它是这样工作的:

  1. 从您的 EMF bean 中删除 @Qualifier
  2. 在每个 EMF Bean 上添加:@DependsOn({"dataSource"}) 以及正确的 DataSource
  3. 确实制作了 DataSource 之一 @Primary

关于mysql - @Qualifier 不能在 Spring Boot 中使用多个 DataSource bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39769555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com