EntityListener

タイムスタンプを設定するコードを一箇所に集中させたいという話をよく聞くのでEntityListenerを用意してみました。

@Entityにリスナークラスを設定します。

@Entity(listener = EmpListener.class)
public interface Emp {

    ...

    TimestampDomain insertTimestamp();

    TimestampDomain updateTimestamp();

}

設定されたリスナークラスのメソッドは更新系のSQLの前に呼ばれます。

public class EmpListener implements EntityListener<Emp> {

    @Override
    public void preDelete(Emp entity) {
    }

    @Override
    public void preInsert(Emp entity) {
        Timestamp timestamp = new Timestamp(new Date().getTime());
        entity.insertTimestamp().set(timestamp);
    }

    @Override
    public void preUpdate(Emp entity) {
        Timestamp timestamp = new Timestamp(new Date().getTime());
        entity.updateTimestamp().set(timestamp);
    }
}

ちょっとした便利機能として、EntityListenerの型パラメータにエンティティクラスと互換性のない型が指定されたらaptでエラーにするようにしました。