Генерирайте jOOQ класове от чиста Java

Има ли начин да генерирате jOOQ класове от чист Java код? Ако не, коя би била най-близката алтернатива? В идеалния случай бих искал да направя това в изграждане на gradle.

Намерих този отговор, който препраща към тази публикация в блог. Същността на този пост е следната:

  1. Започнете с JPA модел
  2. Конвертирайте го в DDL скрипт (.sql файл, пълен с CREATE изрази)
  3. Създайте нов HSQLDB файл и го напълнете с таблици, като изпълните този DDL скрипт върху него. Запазете получената DB на диск.
  4. Заредете тази DB от диска и стартирайте генериране на код на 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();
}

Това ще остави някои .java файла на src/main/java path. Конфигурирайте фрагмента с настройките на вашата база данни и т.н.

Това е приблизително начинът, по който правим нещата в нашите проекти на работа. 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