hibernate - Spring Boot:如何初始化运行时数据源?
问题描述
我正在尝试使用 AbstractRoutingDataSource 设计多租户数据源。我面临的问题是,只有默认数据源正在通过实体表的创建/更新进行初始化。所有其他数据源似乎根本没有初始化。经过一些研究后,我也尝试了DataSourceSchemaCreatedEvent但没有成功。
这是我的 RoutingDataSource 的代码:
public class TenantDataSource extends AbstractRoutingDataSource {
private final TenantResolver tenantResolver = new TenantResolver();
public TenantDataSource(ApplicationContext applicationContext) {
super();
// Default DataSource
PGSimpleDataSource defaultDS = new PGSimpleDataSource();
defaultDS.setURL("jdbc:postgresql://localhost:5432/organization");
defaultDS.setDatabaseName("organization");
defaultDS.setCurrentSchema("default");
defaultDS.setUser("default");
defaultDS.setPassword("default");
applicationContext.publishEvent(new DataSourceSchemaCreatedEvent(defaultDS));
this.setDefaultTargetDataSource(defaultDS);
// Secondary DataSource
PGSimpleDataSource secondaryDS = new PGSimpleDataSource();
engDS.setURL("jdbc:postgresql://localhost:5432/organization");
engDS.setDatabaseName("organization");
engDS.setCurrentSchema("secondary");
engDS.setUser("secondary");
engDS.setPassword("secondary");
applicationContext.publishEvent(new DataSourceSchemaCreatedEvent(secondaryDS));
// DSs
Map<Object, Object> targetDataSources = new ConcurrentHashMap<>();
targetDataSources.put("DEFAULT", defaultDS);
targetDataSources.put("SECONDARY", secondaryDS);
this.setTargetDataSources(targetDataSources);
}
@Override
protected Object determineCurrentLookupKey() {
String tenant = this.tenantResolver.resolve();
return tenant;
}
@Override
protected DataSource resolveSpecifiedDataSource(Object dataSource) throws IllegalArgumentException {
return super.resolveSpecifiedDataSource(dataSource);
}
@Override
protected DataSource determineTargetDataSource() {
DataSource dataSource = super.determineTargetDataSource();
return dataSource;
}
}
这是我的配置类:
@Configuration
@RequiredArgsConstructor
@EnableJpaRepositories(
basePackages = "eu.project.organization.repository.isolated",
entityManagerFactoryRef = "isolatedEntityManagerFactory",
transactionManagerRef = "isolatedTransactionManager"
)
public class IsolatedDatabaseConfiguration {
public static final Class<Driver> PSQL_DRIVER = Driver.class;
private final ApplicationContext applicationContext;
@Bean
public DataSource isolatedDataSource() {
return new TenantDataSource(this.applicationContext);
}
@Bean
public LocalContainerEntityManagerFactoryBean isolatedEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(this.isolatedDataSource());
String isolatedEntitiesPackage = Employee.class.getPackageName();
em.setPackagesToScan(isolatedEntitiesPackage);
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(adapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "update");
properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
em.setJpaPropertyMap(properties);
return em;
}
@Bean
public TransactionManager isolatedTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
EntityManagerFactory entityManagerFactory = this.isolatedEntityManagerFactory().getObject();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
}
通过此设置,当我尝试从secondaryDS获取实体列表时,我得到相应的关系不存在。同样的请求适用于defaultDS。我错过了什么?
解决方案
推荐阅读
- python - 在 Windows x64 位上安装 Opencv-python 时出现问题
- python - 为什么 instagram 不能与 Selenium 无头 Chrome 一起使用?
- node.js - twilio 视频房间:主持人可以从 node.js express 端点静音房间中的参与者吗
- python - 如何在 selenium webdriver python 中找到这个按钮?
- reactjs - ReactJS 和 UIkit 3.6.5:点击事件不会在模式窗口内触发
- javascript - 无法在自定义 Hook 内的回调函数中访问状态
- python - 使用 Python 和 Beautiful Soup 进行 HTML 抓取(来自 IMDb)
- django - 将相关 ID 列表添加到 Django 查询集中的返回值
- html - css将线性渐变添加到背景不起作用,但添加单色可以
- https - 带有可选证书的 Inno 设置 WinHttpRequest