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
  }
}

实体管理器是这样注入的:

@Stateless
public class EmployeeService {

  @Inject
  private EntityManager em;

  ...

}

只要只需要一个没有扩展持久性上下文的实体管理器(在无状态 ejb 中),这个生产者就可以工作。不幸的是,我们也有一些有状态的 ejb,它们需要扩展的持久性上下文。有没有办法为此目的实现 CDI 生产者,或者这种方法仅适用于带有事务实体管理器的无状态 ejb?

4

1 回答 1

-1

我猜你需要这个:在这里创建两个工厂:

@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 回答