JPAでGenericDao - その3

かなり時間が空いてしまいましたがGenericDaoの続き。
Springとの連携を書くと言ってましたが、ちょっと後回しにします。

今回は前回までのGenericDaoに対していろいろ機能追加をします。
追加するのは下記のような機能

  • 論理削除
  • FindAll

まずIEntityに論理削除用のゲッター、及びセッターメソッドを持たせます。

public interface IEntity extends Serializable{

  void setDeleteFlg(int deleteFlg);
  int getDeleteFlg();

}

んで、これを実装するAbstractEntityを作成し、各エンティティクラスはIEntityを直接実装するのではなくAbstractEntityクラスを継承するように変更します。

@MappedSuperclass
public abstract class AbstractEntity implements IEntity{

  @Column(name = "DELETE_FLG", nullable = false)
  private int deleteFlg;

  public void setDeleteFlg(int deleteFlg){
     this.deleteFlg = deleteFlg;
  }

  public int getDeleteFlg(){
     return this.deleteFlg;
  }
}

注意点は@MappedSuperclassのアノテーションを付けていること。これでこのクラスを実装していれば各エンティティクラスにわざわざdeleteFlgの永続化フィールドを設定する必要が無くなります。

次はIGenericDaoにlogicalRemoveメソッドとfindAllメソッドを追加します。

public interface IGenericDao<E extends IEntity,PK extends Serializable> {
    
    /** 他のメソッドは省略・・ **/

    void logicalRemove(E entity);

    List<E> findAll();
}

んで、IGenericDaoを実装するGenericDaoJpaはこんな感じになります。

public class GenericDaoJpa<E extends IEntity, PK extends Serializable> 
                                          implements IGenericDao<E,PK> {

    private EntityManager em;
    private Class<E> clazz;
    
    /** 他のメソッドは前回と同じなので省略 **/

    @Override
    public void logicalRemove(E entity){
        entity.setDeleteFlg(1);
        merge(entity);
    }

    @Override
    public List<E> findAll() {
        return em.createQuery(" From " + clazz.getSimpleName() + " e WHERE e.deleteFlg = 0 ");
    }
}

logicalRemoveメソッド内では論理削除用のフラグをセットしてmergeメソッドを呼び出すことで論理削除処理を行います。
また、findAllメソッド内ではClass#getSimpleNameを使ってエンティティクラスを取得することで動的にJPQLを生成するようにします。ついでに論理削除フラグが立っていないデータのみ取得するようにもしています。