1)爲您的PU創建2個CDI qualifiers:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface SomePC {
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface OtherPC {
}
2)然後暴露你的PU作爲CDI豆
@ApplicationScoped
public class EntityManagerProducer {
@Produces
@PersistenceContext(unitName = "somePU")
@SomePC
private EntityManager em;
@Produces
@PersistenceContext(unitName = "otherPU")
@OtherPC
private EntityManager em;
}
3)在服務注入兩個新興市場:
@Stateless
public class PersistenceService {
@Inject
@SomePC
private emSome;
@Inject
@OtherPC
private emOther;
public SeomthingUseful doSomething(Context myContext){
getEntityManager(myContext);
...
}
private EntityManager getEntityManager(Context myContext){
if(myContext == SOME_PU)
return emSome;
return emOther;
}
}
4)從你的客戶,你可以通過將用於選擇合適的PU上下文(你也可以用於此目的創建RequestScoped豆,在這種情況下,你不必使用方法PARAM):
@RequestScoped
@Path("/persistence")
public class PersistenceResource {
@Inject
PersistenceService service;
public void myMethod(){
service.doSomething(myContext.SOME_PU);
}
}
上下文可以是您需要的不同值的枚舉(SOME_PU,OTHER_PU)。作爲替代,你可以動態地做所有注入新興豆在您的服務如下:
@Inject @Any Instance<EntityManager> emSource;
如果按照這個路徑,然後一切都解釋here