Я пытаюсь спроектировать источник данных Multitenant, используя 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;
}
}
С этой настройкой, когда я пытаюсь получить список сущностей из вторичного DS , я получаю, что соответствующее отношение не существует. Тот же запрос работает нормально с defaultDS . Чего мне не хватает?