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はセッションから取得したいのでサービスクラスでは取得できない。皆さんどのように実装しているのか?いい方法があれば、教えてください。