Мультитенантная миграция для работы с quarkus

Я работаю над переводом приложения на последнюю версию quarkus. Приложение реализует мультитенантность с использованием стратегии базы данных из интерфейсов гибернации. Quarkus рекомендует (если возможно) избегать использования persistence.xml, каков правильный подход для этого случая мультитенантности с учетом контекста quarkus ? сохранить persistence.xml или использовать только application.properties, рекомендованные quarkus?

@Singleton
public class HibernateConnectionProviderFactory implements ConnectionProviderFactory {
    private Logger logger = Logger.getLogger(getClass().getName());

    private static final String TENANT_ID_PLACEHOLDER = "{tenant.id}";

    @Inject
    @SystemProperty("multitenant.hibernate.connection.url")
    private Optional<String> dbUrl;

    @Inject
    @SystemProperty("multitenant.hibernate.connection.driver_class")
    private Optional<String> dbDriverClass;

    @Inject
    @SystemProperty("multitenant.hibernate.dialect")
    private Optional<String> dbDialect;

    @Inject
    @SystemProperty("multitenant.hibernate.connection.username")
    private Optional<String> dbUsername;

    @Inject
    @SystemProperty("multitenant.hibernate.connection.password")
    private Optional<String> dbPassword;

    @Inject
    @SystemProperty(value = "multitenant.hibernate.schema.generation", defaultValue = "false")
    private boolean generateSchema;

    @Inject
    @SystemProperty("multitenant.default.tenant.id")
    private Optional<String> defaultTenantId;

    @Inject
    private PersistenceUnitDescriptorFactory persistenceUnitDescriptorFactory;

    @Inject
    private SchemaGenerator schemaGenerator;

    private final ConcurrentHashMap<String, ConnectionProvider> providers = new ConcurrentHashMap<>();


    @Override
    public Optional<ConnectionProvider> getDefaultConnectionProvider() {
        return defaultTenantId.map(this::getConnectionProvider);
    }

    @Override
    public ConnectionProvider getConnectionProvider(String tenantId) {
        return providers.computeIfAbsent(tenantId, this::createDriverManagerConnectionProvider);
    }


    private ConnectionProvider createDriverManagerConnectionProvider(String tenantId) {
        final PersistenceUnitDescriptor persistenceUnit = persistenceUnitDescriptorFactory.getPersistenceUnitDescriptor(tenantId);
        final Map<Object, Object> persistenceProperties = getPersistenceProperties(tenantId, persistenceUnit.getProperties());
        final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(persistenceProperties).build();

        if (generateSchema) {
            schemaGenerator.updateSchema(serviceRegistry, persistenceUnit);
        }

        final ConnectionProvider connectionProvider = serviceRegistry.getService(ConnectionProvider.class);


        return connectionProvider;
}
//...
}

person Victor    schedule 16.08.2019    source источник


Ответы (1)


В настоящее время мы не поддерживаем настройку мультиарендности Hibernate ORM с помощью Quarkus application.properties, поэтому вам следует использовать метод persistence.xml.

При этом мы могли бы подумать о поддержке его в будущем, если для него будет достаточно тяги. Не могли бы вы открыть вопрос на GitHub, чтобы мы могли собрать отзывы об этой функции?

Спасибо!

person Guillaume Smet    schedule 17.08.2019
comment
Проблема открыта в quarkus github - person Victor; 27.08.2019
comment
@Guillame Smet, есть ли с тех пор прогресс в использовании этой функции? Потому что мне очень нужно перейти на кваркус. Также я разместил аналогичный вопрос stackoverflow.com/questions / 61561056 /, прокомментируйте, пожалуйста - person Bohdan Myslyvchuk; 03.05.2020
comment
Мультитенант находится в разработке на quarkus: github.com/quarkusio/quarkus/issues/5681 - person Victor Ferreira; 05.05.2020