読者です 読者をやめる 読者になる 読者になる

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で独自アノテーションを指定できればいいんだけど、まあ大したコード量でもないし。