Doma-GenのGenタスクで汎用的なエンティティリスナーを利用したコードを生成 ( Doma 0.9.13 SNAPSHOT )
汎用的なエンティティクラスとリスナークラスをコーディングします。たとえばこう。
abstractなエンティティクラス
@Entity public abstract class Common { ... }
Commonのサブタイプを型パラメータとするエンティティリスナークラス
public class CommonListener<T extends Common> implements EntityListener<T> { @Override public void preDelete(T entity) { ... } @Override public void preInsert(T entity) { ... } @Override public void preUpdate(T entity) { ... } }
次に、ビルドファイルに上の2つのクラスを指定します。指定場所は、entityConfigのsuperclassName属性とlistenerSuperclassName属性です。
<gen dialectName="${dialectName}" driverClassName="${driverClassName}" url="${url}" user="${user}" password="${password}"> <entityConfig destDir="${src}" superclassName="example.Common" listenerSuperclassName="example.CommonListener" /> ... </gen>
これで準備はOK。実行するとテーブルごとに次のようなJavaコードが出力されます。
@Entity(listener = AddressListener.class) @Table(name = "ADDRESS") public class Address extends Common { ... }
public class AddressListener extends CommonListener<Address> { }
この例だと、Addressの挿入、更新、削除時にListenerが実行されます。
Address独自の処理がある場合は、AddressListenerでオーバーライドして処理を記述します。オーバーライドしたメソッドでは、ジェネリクスのおかげで、オーバーライド元のCommon型ではなくAddress型を扱えます。