2015-06-29 1 views
3

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

Я нашел this answer, который ссылается на this blog post. Суть этого поста заключается в следующем:

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

Есть три вещи, которые беспокоят меня об этом подходе:

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

ответ

3

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 о Code generation.

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

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

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

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

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

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

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

  1. Запись SQL DDL скриптов (т.е. CREATE TABLE заявления)
  2. Run 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 { 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^