jOOQの生成するクラス名称を変更する



生成されるクラス

jOOQのコードジェネレータを使うと様々なクラスを生成してくれる。POJOやDAOの生成も指示すると、さらにクラスが増える。

※POJOやDAOを生成させるにはコンフィグファイルに以下を入れる。daosを入れるとpojosも指定されたことになる。

<generator>
  <generate>
    <pojos>true</pojos>
    <daos>true</daos>
  </generate>
</generator>

さて、例えば、some_tableというテーブルについてdaoもpojoも生成させると、

  • SomeTable:フィールド定義クラス
  • SomeTableRecord:CRUD
  • SomeTable:POJO
  • SomeTableDao:DAO

特にフィールド定義とPOJOが同じ名前(パッケージが違うだけ)なのは扱いにくいし、CRUD用クラスもRecordは長すぎる。

クラス名称を変更する

これらのクラス名称変更機能は、元からjOOQに備わっている。

まずコンフィグのgenerator/strategryを指定する。

  <generator>
    <name>org.jooq.codegen.JavaGenerator</name>
    <strategy>
      <name>foo.bar.FooBarGeneratorStrategy</name>
    </strategy>

FooBarGeneratorStrategyを以下とする。

package foo.bar;

import org.jooq.codegen.*;
import org.jooq.meta.*;

/**
 * 生成されるJavaクラス名称を変更する
 * @see <a href="https://www.jooq.org/doc/3.11/manual/code-generation/codegen-generatorstrategy/#N5141E">
 * Using custom generator strategies to override naming schemes</a>
 */
public class FooBarGeneratorStrategy extends DefaultGeneratorStrategy {

   @Override
   public String getJavaClassName(Definition definition, Mode mode) {

     // テーブル定義以外はそのまま
     if (!(definition instanceof TableDefinition)) {
       return super.getJavaClassName(definition, mode);
     }

     // デフォルトの名称を得る。tbl_somethingであればTblSomethingになる。
     String name = super.getJavaClassName(definition, Mode.DEFAULT);

     // モードに応じて名称変更
     switch (mode) {
     case DEFAULT: break; //そのまま
     case DAO: name += "Dao"; break;
     case RECORD: name += "R"; break;
     case POJO:   name += "P"; break;
     default: break;
     }

     //System.out.println("getJavaClassName " + definition.getClass() + "," + mode + "," + name);     

     return name;
   }
}

これだけだ。以下のようにクラス名が変更されている。

POJOのフィールドをpublicにしたい

さらにPOJOのフィールドがprivateになっているのだが、こんな必要は無いのでpublicにしたいのだが、結論から言えば断念した。

これは、org.jooq.codegen.JavaGeneratorで行われており、3.11.11のソースだと、1156行目あたりで行われている。

            for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
                out.tab(1).println("private %s%s %s;",
                    generateImmutablePojos() ? "final " : "",
                    StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)), maxLength),
                    getStrategy().getJavaMemberName(column, Mode.POJO));
            }

ここでがっつりとprivateと記述されているため、変更は難しい。もちろんできないことは無いのだが。