Настройка базы данных с нуля во время выполнения - PullRequest
2 голосов
/ 29 июня 2019

В настоящее время я работаю над приложением базы данных Java, которое я хочу быть полностью автономным (т. Е. Один файл .jar и файл конфигурации, больше ничего). Это действительно небольшой проект, и у меня нет причудливых конвейеров сборки и дополнительных данных приложений, как для коммерческой базы кода - отсюда и желание простого решения с одним jar.

Часть достижения этого включает в себя внедрение H2 в приложение и настройку базы данных во время выполнения. Однако я не уверен, как применить мою желаемую схему в этом случае использования. Давайте использовать эту таблицу в качестве примера.

+-------------+------------+----------+---------+
| Column name | Data type  | Nullable | Default |
+-------------+------------+----------+---------+
| id          | BIGINT     | FALSE    | -       |
| prefix      | VARCHAR(3) | FALSE    | 'g!'    |
+-------------+------------+----------+---------+

Вот мои два решения.

Программно раскладываем столы с помощью jOOQ:

try (DSLContext ctx = DSL.using(dataSource, SQLDialect.MYSQL)) {
    ctx.createTableIfNotExists("guilds")
        .column("id", SQLDataType.BIGINT.nullable(false))
        .column("prefix", SQLDataType.VARCHAR(3).nullable(false).defaultValue("g!"))
        .constraint(constraint("PK_GUILDS").primaryKey(field("id")))
        .execute();
}

Естественно, в этом случае я не могу использовать генерацию кода в jOOQ, так как не для чего генерировать классы. Это работает и является полностью программным, но это действительно уродливо и забивает класс статическим импортом. Расширение его для добавления большего количества таблиц и / или столбцов является болезненным и делает код еще менее читабельным.

Другая вещь, которую я попробовал, была Flyway, которая довольно проста и не так ужасна. Все, что мне нужно, это небольшой .sql файл, который устанавливает мою схему, например:

create table guilds(
    id BIGINT NOT NULL,
    prefix VARCHAR(3) NOT NULL,
    PRIMARY KEY(id)
);

Затем я могу запустить задачу Gradle, чтобы сгенерировать пустую базу данных H2 со всеми таблицами, уже настроенными и готовыми к работе. Gradle даже позволяет мне указать эту задачу для запуска прямо перед сборкой. В этом случае я также могу использовать генерацию кода jOOQ, что значительно облегчает работу lot . Хотя все это происходит во время компиляции, поэтому, насколько я понимаю, мне пришлось бы упаковывать приложение с пустым файлом базы данных. Это, конечно, не соответствует желанию одной банки, которое я изначально хотел.

Есть ли чистый, "обычный" способ сделать это или же создание приложения таким способом - просто не то, что кто-либо делает, когда задействована база данных?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

С точки зрения jOOQ, мы настоятельно рекомендуем вам выбрать Пролетный путь или что-то подобное.Причина этого в том, что когда ваш проект развивается, вы будете очень счастливы выбрать путь, в котором вы будете полностью контролировать эволюцию своей схемы, вместо того, чтобы позволить сторонним продуктам управлять этим для вас,и интеграция с jOOQ работает без усилий.

API-интерфейс jOOQ DDL, который вы пробовали ранее, может, конечно, работать, например, когда вы используете этот API с Flyway или чем-то похожим как программныйЭволюция схемы API.Вы все еще можете создать один файл в качестве вывода, даже если у вас есть несколько модулей в качестве ввода.Например, вы можете использовать maven-assembly-plugin для производства этой единственной банки.Это конкретное ограничение сборки не должно быть движущим фактором в вашем решении о том, как управлять схемой вашей базы данных.

1 голос
/ 29 июня 2019

Вы должны использовать Spring – Data и позволить ему сделать всю работу за вас. В свойствах приложения вы настраиваете свой источник данных. Вы создаете свои сущности (аннотированные классы) и свои репозитории. Когда вы закончите и сделаете вид, что используете hibernate, вы можете просто добавить свойство, подобное "hibernate.hbm2ddl.auto", "create-drop", в свойства вашего приложения. Это автоматически создаст и также удалит базу данных для вас. Дополнительный код не требуется. Есть больше параметров конфигурации, как это. Вы найдете их в руководстве.

...