Spring Boot: как инициализировать источники данных времени выполнения? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь спроектировать источник данных 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 . Чего мне не хватает?

...