DeltaSpike Data Module(使いそうなところだけ)まとめ1
DeltaSpike Data ModuleはRepositoryパターンを提供してくれるモジュール。
というのは昨日も書いた。実際に少し試してみる。
DeltaSpike 1.5.1
参考Data Module
Project Setup
依存設定(Declare Data Module Dependencies)
Maven前提。pomに「deltaspike-data-module-api」をcompileで、「deltaspike-data-module-impl」をruntimeで依存設定する。Java環境(Complete Additional Java Environment Configuration)
JPA必須(当たり前)、JavaMEじゃなければOK。CDIを使うのでJavaSEの場合はWeldなり何なり入れる。プロジェクト設定?(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、後ろはプライマリキーカラムの型を指定する。