Создание классов jOOQ из чистой Java

Есть ли способ сгенерировать классы jOOQ из чистого кода Java? Если нет, то какая альтернатива будет ближайшей? В идеале я бы хотел сделать это в сборке Gradle.

Я нашел этот ответ, который ссылается на это сообщение в блоге. Суть поста такова:

  1. Начните с модели JPA
  2. Преобразуйте его в сценарий DDL (файл .sql, полный операторов CREATE)
  3. Создайте новый файл HSQLDB и заполните его таблицами, запустив на нем сценарий DDL. Сохраните полученную БД на диск.
  4. Загрузите эту БД с диска и запустите на ней генерацию кода jOOQ
  5. использовать полученные сгенерированные классы jOOQ.

В этом подходе меня беспокоят три вещи:

  • Это сообщение в блоге делает все в Maven (и Ant). Я бы хотел использовать Gradle, но я могу обойти это.
  • Я должен начать с JPA. Я бы предпочел начать с чистого определения моей схемы jOOQ. Есть ли в jOOQ определение схемы DSL / API?
  • Промежуточные шаги (сценарий DDL и создание HSQLDB) не нужны в качестве конечного продукта. Вместо этого они нужны только для преобразования модели JPA во что-то, что jOOQ понимает как ввод. Должен быть более аккуратный (только для java) способ, даже если jOOQ не имеет собственного API определения схемы. Есть один?

person derabbink    schedule 29.06.2015    source источник


Ответы (2)


Jooq необходимо заранее создать несколько таблиц. Вы можете использовать для этого Flyway (и вам также следует использовать его миграции).

Когда у вас есть все таблицы, вы можете использовать этот фрагмент, чтобы Jooq сгенерировал исходные файлы для ваших таблиц:

import org.jooq.util.GenerationTool;
import org.jooq.util.jaxb.*;

Configuration configuration = new Configuration()
    .withJdbc(new Jdbc()
        .withDriver("org.postgresql.Driver")
        .withUrl("jdbc:postgresql://localhost/your_database")
        .withUser("username")
        .withPassword("password"))
    .withGenerator(new Generator()
        .withName("org.jooq.util.DefaultGenerator")
        .withDatabase(new Database()
                .withName("org.jooq.util.postgres.PostgresDatabase")
                .withIncludes(".*")
                .withSchemata(new Schema().withInputSchema("your_schema"))
        )
        .withTarget(new Target()
            .withPackageName("jooq.generate")
            .withDirectory("src/main/java")));
try {
  GenerationTool.generate(configuration);
} catch (Exception e) {
  e.printStackTrace();
}

В результате на src/main/java path останется несколько .java файлов. Настройте сниппет с настройками вашей базы данных и т. Д.

Примерно так мы поступаем в наших проектах на работе. Jooq прекрасно работает с Flyway. Вы можете проверить документацию Jooq о генерации кода.

Есть плагин для maven, который мы не используем, потому что у нас есть многопользовательская установка, которая требует некоторой конфигурации времени выполнения для миграции базы данных и генерации кода.

Я предполагаю, что после того, как вы подготовили свое поколение Jooq в статическом основном методе некоторого класса, вы могли бы запустить его из задачи gradle. Я могу указать вам только на документацию Jooq по запуску его из gradle здесь

Редактировать. Из любопытства изучив документацию и сгенерированный мной код, я понял, что вы можете расширить классы Record и TableImpl<Record> для создания классов схемы, созданных вручную.

Вы можете увидеть здесь небольшой фрагмент кода важных частей на Record и Table классах.

В любом случае, примите во внимание, что Jooq (и Flyway) не хотят, чтобы вы избегали SQL, а принимали его. Обычный способ делать что-то -

  1. вы создаете объекты базы данных с помощью скриптов SQL
  2. вы используете генератор Jooq для создания классов схемы
  3. вы используете их с DSL-контекстом Jooq.
person ggalmazor    schedule 29.06.2015

Основываясь на ответе @ ggalmazor, я в конечном итоге использовал в основном код Java с минимальным ядром сценариев SQL. Теперь мой процесс генерации кода состоит из 3 простых шагов:

  1. Написание сценариев SQL DDL (т.е. CREATE TABLE операторов)
  2. Запускаем Flyway, создаем базу данных H2 в памяти.
  3. Запустите jOOQ в той же базе данных, чтобы сгенерировать код Java.

И Flyway, и jOOQ полностью настроены на Java-коде; файлы конфигурации xml не требуются.

Это мой код:

public class Main {

    public static void main(String... args) {
        JdbcDataSource ds = new JdbcDataSource();
        ds.setURL("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
        ds.setUser("u");
        ds.setPassword("p");

        // Flyway
        Flyway flyway = new Flyway();
        flyway.setDataSource(ds);
        flyway.setLocations("classpath:com.example.datadefinition.flyway.migrations");
        flyway.migrate();

        // jOOQ
        try (Connection c = ds.getConnection()) {
            Configuration configuration = new Configuration()
                .withGenerator(new Generator()
                    .withName(MyOwnGenerator.class.getCanonicalName())
                    .withDatabase(new Database()
                        .withName(H2Database.class.getCanonicalName())
                        .withIncludes(".*")
                        .withExcludes("")
                        .withInputSchema("PUBLIC")
                    )
                    .withTarget(new Target()
                        .withPackageName("com.example.lib.data")
                        // jOOQ will create package folders for com.example.lib.data
                        .withDirectory("../sibling-project/src/main")
                    )
                );

            GenerationTool tool = new GenerationTool();
            tool.setConnection(c);
            tool.run(configuration);
        } catch (SQLException e) {
            // sql connection problems
            e.printStackTrace();
        } catch (Exception e) {
            // run failed
            e.printStackTrace();
        }
    }
}

public class MyOwnGenerator extends JavaGenerator {

    public SwsGenerator() {
        setStrategy(new MyOwnGeneratorStrategy());
    }

}

public class MyOwnGeneratorStrategy extends DefaultGeneratorStrategy {

}
person derabbink    schedule 09.07.2015