DeltaSpike Data Module(使いそうなところだけ)まとめ1

DeltaSpike Data ModuleはRepositoryパターンを提供してくれるモジュール。
というのは昨日も書いた。実際に少し試してみる。
DeltaSpike 1.5.1
参考Data Module

Project Setup

  1. 依存設定(Declare Data Module Dependencies)
    Maven前提。pomに「deltaspike-data-module-api」をcompileで、「deltaspike-data-module-impl」をruntimeで依存設定する。

  2. Java環境(Complete Additional Java Environment Configuration)
    JPA必須(当たり前)、JavaMEじゃなければOK。CDIを使うのでJavaSEの場合はWeldなり何なり入れる。

  3. プロジェクト設定?(Complete Additional Project Configuration)
    EntityManagerのProducerを作っておく。Data Moduleのページにあるサンプルは@PersistenceUnitを使ったJavaEE用。今回はJavaSE(Tomcat)で動かすので、Factoryを自前で取得して返すメソッドにする。

public class EntityManagerProducer {
    @Produces
    @RequestScoped
    protected EntityManager createEntityManager() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("testProvider");
        return factory.createEntityManager();
    }
    protected void closeEntityManager(@Disposes EntityManager entityManager) {
        if (entityManager.isOpen()) {
            entityManager.close();
        }
    }
}

JTAデータソースを使うならbeans.xmlに追記する必要があるらしいけどスキップ。

Core Concepts

  • Repositoryについて
    Repositoryを使うには@Repositoryを指定したinterfaceかabstrace classを作る。forEntityで対象Entityを指定する。
@Repository(forEntity = Person.class)
public abstract class PersonRepository {}

@Repository(forEntity = Person.class)
public interface PersonRepository {}
  • EntityRepositoryインターフェース、AbstractEntityRepositoryクラス
    EntityRepositoryにはよく使いそうなメソッドが定義されている。
    findBy(プライマリキーで検索)、findAll、save、remove、etc...
    AbstractEntityRepositoryはEntityRepositoryをimplementした抽象クラスなので、同じく同様のメソッドが定義済み。
    なのでこれらを継承したインターフェース or 抽象クラスを作る方がオススメ。
    更に言うと、ドキュメントの最後の方まで読むと、インターフェースよりも抽象クラスにしておく方が、後々拡張したいと思ったときに楽な気がする。
@Repository
public interface PersonRepository extends EntityRepository<Person, Long> {}

@Repository
public abstract class PersonRepository extends AbstractEntityRepository<Person, Long> {}

ジェネリクスの<Person, Long>は、前はEntity、後ろはプライマリキーカラムの型を指定する。

  • Deactivating Repositories?
    DeltaSpike Coreの機能でDeactivateできるらしい。非アクティブ化? とりあえず保留。

  • Using Multiple EntityManagers
    これは昨日書いたのでスキップ。

  • Other EntityManager Methods
    EntityRepositoryは一般的なメソッドだけ用意されているので、EntityMangerの他メソッドを使いたければEntityManagerDelegateを使えばいいみたい。必要になったら再調査。