#hibernate #spring-data-jpa
Вопрос:
У нас есть требование.
- Мы должны динамически создавать базу данных/схему.
- Мы получим схему/базу данных во время выполнения, и нам нужно будет динамически подключить эту базу данных, если она уже существует, в противном случае потребуется создать базу данных/схему и подключиться к ней.
Структура для всех схем/баз данных одинакова, это означает, что имена таблиц будут одинаковыми во всех базах данных/схемах.
Пожалуйста, веди меня.
Ответ №1:
Я столкнулся с подобным случаем, как и вы. Я могу дать вам только некоторые исходные фрагменты из моего проекта, и я надеюсь, что у вас появится идея.
- Динамическое создание схемы
...
// we need a datasource config from your current ApplicationContext
HikariDataSource dataSource = (HikariDataSource) ctx.getBean("mydatasource");
var currentConnection = dataSource.getConnection();
boolean isSchemaCreated = currentConnection.createStatement()
.execute(String.format("CREATE SCHEMA IF NOT EXISTS "%s";", schemaName));
var connectionURLString = currentConnection.getMetaData().getURL() "?currentSchema=" schemaName;
logger.info("connection URL with schema: {}", connectionURLString);
Map<String, String> settings = new HashMap<>();
settings.put(AvailableSettings.DRIVER, driver);
settings.put(AvailableSettings.DIALECT, dialect);
settings.put(AvailableSettings.URL, connectionURLString);
settings.put(AvailableSettings.USER, user);
settings.put(AvailableSettings.PASS, pass);
...
var metadata = new MetadataSources(new StandardServiceRegistryBuilder().applySettings(settings).build());
List<Class<?>> annotatedClasses = ...
annotatedClasses.forEach(c -> metadata.addAnnotatedClass(c));
var schemaExport = new SchemaExport();
schemaExport.setFormat(true);
schemaExport.setDelimiter(";");
schemaExport.execute(EnumSet.of(TargetType.DATABASE), Action.CREATE, metadata.buildMetadata());
schemaExport.getExceptions().forEach(e -> logger.info(((Exception) e).getCause().getMessage()));
...
- Схемы переключения во время выполнения (мульти-аренда)
То, что вам здесь нужно,-это своего рода многопользовательская аренда, которая может быть реализована с помощью поставщика hibernate MultiTenantConnectionProvider. Здесь вы установили и освободили схему базы данных, когда ваше приложение запрашивает подключение к базе данных.
Комментарии:
1. Мы также должны создавать таблицы при создании схемы. Является ли лучшим подходом создание хранимой процедуры, которая создает схему и таблицу за один раз. пожалуйста, посоветуйте мне это.
2. Да, ваш подход также является жизнеспособным вариантом. Для меня это был невыполнимый вариант, потому что в моем проекте есть случаи, когда таблицы также отличаются. Я забыл упомянуть, что
annotatedClasses
это классы сущностей JPA, которые используются для создания таблиц в базе данных с помощью инструмента SchemaExport.