【发布时间】:2019-08-17 21:37:00
【问题描述】:
我正在迁移一个应用程序以使用最新版本的 quarkus。该应用使用 hibernate 接口 中的数据库策略实现多租户。 Quarkus 建议(如果可能) 避免使用 persistence.xml,对于这种多租户的情况,考虑到 quarkus 上下文,正确的方法是什么> ?保留 persistence.xml 还是只使用 quarkus 推荐的 application.properties ?
@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;
}
//...
}
【问题讨论】:
标签: java hibernate multi-tenant quarkus