使用CDI @Producer
方法。我假設你懂得,你有@PersistenceContext
S中的許多區別對待,所以你做製片人,是這樣的:
// first inject all the entity managers that you have into your CDI producer
@PersistenceContext(name = "name0")
private EntitManager em0;
@PersistenceContext(name = "name1")
private EntitManager em1;
@PersistenceContext(name = "name2")
private EntitManager em2;
...
// then have your producer method with logic to chose the right EntityManager to be returned
@Produces @MyPersistenceContext
public EntityManager obtainTheRightEM(InjectionPoint caller) {
if (hasCondition0(caller)) {
return em0;
} else if (hasCondition1(caller)) {
return em1;
} else if (hasCondition2(caller)) {
return em2;
} else {
...
}
}
然後在你的@EJB
是你與@Inject @MyPersistenceContext
更換@PersistenceContext
。
此外,創建@MyPersistenceContext
預選賽可能會或可能不會根據您的具體問題是必要的。如果你有你需要向下傳遞給生產者,以方便上EntityManager
從您的生產者返回的決定特別配置值,看看在你的自定義限定使用一些@Nonbinding
領域。
你可能最終就要用只有一個@EJB
部署。
乾杯!希望這可以幫助。
非常感謝Kazaag的回答。讓我再解釋一下。 – user1444322
感謝很多關於你的answer.Let我解釋一些。數據庫是不同的,但具有相同relations.I've已經嘗試第二個解決方案您介紹了,但是還是不行。在同一個容器中(這是我的第一次嘗試),我有Session Beans衝突(第一個會話bean調用用於以下請求,而不管名爲id的應用程序,在會話Bean池級別缺少隔離)以及唯一方法會重命名會話bean接口,這是我爲了維護較輕的代碼而要避免的。所以,讓我試驗第一個概述的解決方案。 Stfn – user1444322
如果EJB不同,它們應該具有不同的全局名稱,因此通過JNDI檢索它們應該會給出相應的名稱。 – Kazaag