1

ログインしたユーザーに応じてエンティティマネージャーを「生成」するシステムを構築しようとしています (マルチテナンシーの種類)。そのため、次のようなステートレス ejb を実装しました。

@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class CustomEntityManagerFactory {

  @PersistenceContext(unitName = "EM1")
  private EntityManager em1;

  @PersistenceContext(unitName = "EM2")
  private EntityManager em2;

  @Produces
  @RequestScoped
  public EntityManager getEntityManager() {
    // check which entitymanager to return
  }
}

entitymanager は次のように挿入されます。

@Stateless
public class EmployeeService {

  @Inject
  private EntityManager em;

  ...

}

このプロデューサは、(ステートレス ejb で) 拡張永続コンテキストを持たないエンティティ マネージャのみが必要である限り機能します。残念ながら、拡張永続コンテキストを必要とするステートフルな ejb もいくつかあります。この目的のために CDI プロデューサーを実装する方法はありますか、またはこのアプローチはトランザクションエンティティマネージャーを使用したステートレス ejb でのみ機能しますか?

4

1 に答える 1

-1

私の推測では、これが必要です。ここに2つのファクトリを作成します。

@ApplicationScoped
public class EntityManagerFactoryProducer {

    private static EntityManagerFactory factory;
    private static EntityManagerFactory factory2;

    @Produces
    public EntityManagerFactory getEntityManagerFactory(InjectionPoint ip) {
    // if the field is named exactly factory2 then factory2 is produced
    if (ip.getMember().getName().equals("factory2")) {

        if (factory2 == null) {
        factory2 = Persistence.createEntityManagerFactory("EM2");
        }
        return factory2;
    }

    else {
        if (factory == null) {
        factory = Persistence.createEntityManagerFactory("EM1");
        }
        return factory;
    }
    }

工場を使用してEntityManagersを作成する

public class EntityManagerProducer {
    @Inject
    private EntityManagerFactory factory;

    @Inject
    private EntityManagerFactory factory2;

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return factory.createEntityManager();
    }

    @Produces
    @RequestScoped
    @MyCustomQualifier
    public EntityManager getEntityManager2() {
        return factory2.createEntityManager();
    }

}

エンティティマネージャー間で異なるために使用される修飾子

@Qualifier
@Retention(RUNTIME)
@Target({FIELD })
public @interface MyCustomQualifier {
    @Nonbinding
    public String value() default "";
}

最終使用法:

@Inject
EntityManager em;

@Inject
@MyCustomQualifier
EntityManager em2;

もちろん、フィールドの名前をチェックする代わりに、修飾子を使用してファクトリ間で異なるものにすることができます。答えをもう少し深く知りたかっただけです。

于 2012-10-17T18:33:40.587 に答える