У меня проблема с созданием новой схемы во время работы приложения.Мне удалось создать фильтр, который переключается между схемами для подключения к нужной, но теперь я хотел бы использовать Hibernate или Spring для создания новой схемы внутри текущего приложения.Я использую подход MultiTenancyStrategy.SCHEMA.
В моем контроллере покоя у меня есть метод, разработанный для администраторов, просто добавить новое приложение клиент / схему.Этот метод должен позаботиться о создании схемы, таблиц и всего остального.Пока мне удалось все сделать, запустив другое приложение SpringBoot как процесс и дождавшись его завершения.
try (Statement stmt = dataSource.getConnection().createStatement();) {
stmt.execute("CREATE SCHEMA "+instance.getDomain()+" AUTHORIZATION "+dbUsername+";");
//execute java -jar schemacreator ...
List<String> commands = new ArrayList<>();
commands.add("java");
commands.add("-jar");
commands.add(dbCreatorPath);//database creator path to find an app we have to run
commands.add(dbUrl);//arg 1 - url for the database
commands.add(dbUsername);//arg 2 - db username
commands.add(dbPassword);//arg 3 - db password
commands.add(instance.getDomain());//arg 4 - name of the generated schema
Process p = new ProcessBuilder(commands).start();
if (log.isDebugEnabled()) {
try(BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
}
}
int exitValue = p.waitFor();
log.info("Exit value of database creator tool: {}", exitValue);
if (exitValue!=0) {//tables were created successfully
throw new RuntimeException("Exit value of db creator tool was not as expected but was "+exitValue);
}
} catch (Exception e) {
log.error(e.getLocalizedMessage(), e);
}
Это работает нормально, поскольку создатель базы данных имеет свойство spring.jpa.hibernate.ddl-autoустановить на обновление, которые создают таблицы.Может быть, важно знать, что я использую только один источник данных.
Итак, есть ли какой-нибудь внутренний метод / подход, который можно использовать для создания таблиц на только что созданной схеме?Лучше всего, если аннотированные классы могут быть найдены в classpath автоматически.По сути, здесь должен произойти тот же процесс, который происходит при запуске SpringBoot, где выполняется ddl.
Я использую:
spring-boot-starter-parent 2.1.1.RELEASE
spring-boot-starter-data-jpa 2.1.1.RELEASE
PostgreSQL
Любая помощь или хотя бы направление будут очень полезны.Спасибо!