При необходимости создайте схему и таблицы с помощью весенней загрузки во время работы приложения - PullRequest
2 голосов
/ 09 июля 2019

У меня проблема с созданием новой схемы во время работы приложения.Мне удалось создать фильтр, который переключается между схемами для подключения к нужной, но теперь я хотел бы использовать 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

Любая помощь или хотя бы направление будут очень полезны.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...