DBアクセス時の共通処理の実装

DBアクセス時に共通化したい処理はいくつかあるが、まずは、"INSERT時に更新日時をセットする"という単純なものをS2JDBCで作ってみた。
(以下の記事を非常に参考にさせていただきました。)
S2JDBC の弱点を補完するS2AbstractService - 出羽ブログ

テーブル構造

下記のようなシンプルなテーブルを用意。

CREATE TABLE EMP_TEST(
ID INT(3),
NAME VARCHAR(20),
UPDATE_TIME TIMESTAMP
);

エンティティの作成

全てのテーブルに共通に存在するカラムを、共通のスーパークラスとして定義。
@MappedSuperclassをつけないと、サブクラスの永続プロパティと見なされないので注意。

@MappedSuperclass
public abstract class AbstractEntity {
    
    @Temporal(TemporalType.TIMESTAMP)
    public Date updateTime;
}

次に、共通のスーパクラスを継承したサブクラスを作成。

@Entity
public class EmpTest extends AbstractEntity {

    @Id
    public Integer id;

    public String name;
}

サービスの作成

S2AbstractServiceを継承して、共通のスーパークラスを作成。引数に先ほど作成した、共通のエンティティクラスを持つ、insertメソッドを作成。ここに共通の処理を実装。

public abstract class AbstractService<ENTITY> extends S2AbstractService<ENTITY> {

    public int insert(AbstractEntity entity) {

        //updateTimeにシステム時間をセット       
        Date currentDate = new Date(System.currentTimeMillis());
        entity.updateTime = currentDate;

        return jdbcManager.insert(entity).execute();
    }
}

次に、共通のスーパクラスを継承したサブクラスを作成。
特に固有の処理が必要なければ、空っぽにする。

public class EmpTestService extends AbstractService<AbstractEntity> {
}

呼び出し部分の作成

...
emp.id=1;
emp.name="TEST";
empTestService.insert(emp);
...

これで完成。
他にも"登録者のユーザIDをセットする"ということもやりたいのだが、ユーザIDはセッションから取得したいのでサービスクラスでは取得できない。皆さんどのように実装しているのか?いい方法があれば、教えてください。