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と記述されているため、変更は難しい。もちろんできないことは無いのだが。