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型を扱えます。