AO#6 Name Converter

今回は An Easier Java ORM Part 4 の Pluggable Name Converters を見ていきます。テーブルとエンティティクラスのマッピングの話題です。

名前のマッピング方法はデフォルトでは Camel Case 方式 (実際には先頭を小文字にするだけ) です。例えば BillingAddress クラスなら billingAddress テーブルが作成されます。

@Table アノテーションを使って明示的にテーブル名を指定することもできます。
@Table ("PERSON_TBL")
public class Person {
…
}
名前変換は TableNameConverter を実装するクラスが担当していて、取り替えができる (pluggable) ようになっています。EntityManager に対して setNameConverter で実装クラスを渡してやります。
manager.setNameConverter(new MyNameConverter());
元記事には、自分で作る場合は AbstractTableNameConverter を継承するのがお勧めとありますが後述する PluralizedNameConverter に特化したような処理が含まれるので、自前で TableNameConverter を実装した方が手っ取り早いと思います。

その場合、上記の @Table の処理を実装しておいた方がいいでしょう。下記のコードを含むだけで良いです。
Table tableAnnotation = entity.getAnnotation(Table.class);
		if (tableAnnotation != null) {
			return tableAnnotation.value();
		}
English Pluralization ActiveObjects にはデフォルトの CamelCaseTableNameConverter の他に英単語の複数形を考慮に入れた PluralizedNameConverter が用意されています。語尾に s を付けるだけでなく Person -> people のような特殊なものまでサポートされています。

試してみました。
em.setNameConverter(new PluralizedNameConverter());
em.migrate(Cactus.class);
こんなテーブルが作成されました。
CREATE TABLE cacti (
    id INTEGER AUTO_INCREMENT NOT NULL,
    name VARCHAR(45),
    PRIMARY KEY(id)
) ENGINE=InnoDB
サボテンクラスってのも変な話ですが、ちゃんと変換されてることが確認できました ;-p

実装としては変換ルールを書いたプロパティファイルを使って変換しています。net/java/ao/schema/englishPluralRules.properties を見れば変換の仕組みがわかると思います。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

Menu

ここは自由に編集できるエリアです。

管理人/副管理人のみ編集できます