DeltaSpike Data Moduleで複数EntityManagerを呼び分ける
DeltaSpike Data ModuleはRepositoryパターンを提供してくれるモジュール。
・・・リポジトリ パターンは不勉強、とりあえす典型コード(boilerplate code)をすっきりさせてくれるらしい、と理解しておく。
DeltaSpike 1.5.1
参考 Data Module
本題
「複数のEntityManagerを使うにはEntityManagerConfig アノテーションをRepositoryに付ける」とある。
EntityMangerのProducer
public class EntityManagerProducer { @Produces @TestDS @RequestScoped protected EntityManager createEntityManager() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("testProvider"); return factory.createEntityManager(); } @Produces @CommonDS @RequestScoped protected EntityManager createCommonEntityManager() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("commonProvider"); return factory.createEntityManager(); } protected void closeEntityManager(@Disposes @TestDS EntityManager entityManager) { if (entityManager.isOpen()) { entityManager.close(); } } protected void closeCommonEntityManager(@Disposes @CommonDS EntityManager entityManager) { if (entityManager.isOpen()) { entityManager.close(); } } }
前に使った物そのまま。独自アノテーションでEntityManagerを複数提供できるようにしている。
EntityManagerResolver
public class TestEntityManagerResolver implements EntityManagerResolver { @Inject @TestDS @RequestScoped private EntityManager entityManager; @Override public EntityManager resolveEntityManager() { return this.entityManager; } }
public class CommonEntityManagerResolver implements EntityManagerResolver { @Inject @CommonDS @RequestScoped private EntityManager entityManager; @Override public EntityManager resolveEntityManager() { return this.entityManager; } }
EntityManagerResolverを実装してresolveEntityManager()でEntityManagerを返す。
独自アノテーション付きでEntityMangerをInjectして、それを返しているだけ。
Repository
@Repository @EntityManagerConfig(entityManagerResolver = TestEntityManagerResolver.class) public interface UserRepository extends EntityRepository<User, Integer>{}
@Repository @EntityManagerConfig(entityManagerResolver = CommonEntityManagerResolver.class) public interface GroupRepository extends EntityRepository<Group, Integer>{}
@EntityManagerConfigのentityManagerResolverに、欲しいEntityManagerを返してくれるResolverを指定する。
以上。
難しくないがちょっと嬉しくない仕組み。独自アノテーション作ってるのに、さらにResolverクラスを作らないといけない。
@Repositoryで独自アノテーションを指定できればいいんだけど、まあ大したコード量でもないし。