2012-09-05 34 views
0

我有一個會話bean類,它有一些數據庫操作。我需要使用具有多個數據庫的類,因此我將ejb-jar.xml配置爲從該類創建會話bean,每個數據庫都使用每個bean。這是代碼。將實體管理器注入到同一類的多個bean中

public class UserEM 
{ 
    /** The entity manager */ 
    @Resource(name="userEntityManager/em") 
    private EntityManager em; 

    public EntityManager getEntityManager() 
    { 
     return this.em; 
    } 

    ... Database operations using the `em` ... 
} 

這裏是ejb-jar.xml中

... 
    <enterprise-beans> 
    <session> 
     <ejb-name>UserEM1</ejb-name> 
     <ejb-class>com.abc.app.dao.UserEM</ejb-class> 
     <session-type>Stateless</session-type> 

     <persistence-context-ref> 
     <persistence-context-ref-name>userEntityManager/em</persistence-context-ref-name> 
     <persistence-unit-name>DataSource1</persistence-unit-name> 
     </persistence-context-ref> 
    </session> 
    <session> 
     <ejb-name>UserEM2</ejb-name> 
     <ejb-class>com.abc.app.dao.UserEM</ejb-class> 
     <session-type>Stateless</session-type> 

     <persistence-context-ref> 
     <persistence-context-ref-name>userEntityManager/em</persistence-context-ref-name> 
     <persistence-unit-name>DataSource1</persistence-unit-name> 
     </persistence-context-ref> 
    </session> 
    </enterprise-beans> 
</ejb-jar> 
... 

當我只創建一個會話bean,它按預期工作。但我創建了兩個以上,它在部署時拋出異常:

Caused by: java.lang.IllegalArgumentException: JBAS011053: Incompatible conflicting binding at java:comp/env/userEntityManager/em source: [email protected]b07ef 
    at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:237) 
    at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:136) 
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final] 

這裏發生了什麼事情。誰能幫忙?任何建議或意見都被佔用。

納瓦

回答

1

玩了一段時間後,我找到了解決方案。這是代碼。

這裏是ejb-jar.xml中

... 
    <enterprise-beans> 
    <session> 
     <ejb-name>UserEM1</ejb-name> 
     <ejb-class>com.abc.app.dao.UserEM</ejb-class> 
     <session-type>Stateless</session-type> 

     <persistence-context-ref> 
     <persistence-context-ref-name>userEntityManager/em1</persistence-context-ref-name> 
     <persistence-unit-name>DataSource1</persistence-unit-name> 
     </persistence-context-ref> 
    </session> 
    <session> 
     <ejb-name>UserEM2</ejb-name> 
     <ejb-class>com.abc.app.dao.UserEM</ejb-class> 
     <session-type>Stateless</session-type> 

     <persistence-context-ref> 
     <persistence-context-ref-name>userEntityManager/em2</persistence-context-ref-name> 
     <persistence-unit-name>DataSource2</persistence-unit-name> 
     </persistence-context-ref> 
    </session> 
    </enterprise-beans> 
</ejb-jar> 
... 

什麼我不知道的是,我們不僅在這裏宣佈兩個EJB但我們也宣佈其爲兩根持久化上下文的參考名稱在應用程序中獨一無二另一個詞'persistence-context-ref-name'中的值也必須是唯一的。一旦完成了這個應用程序的部署,兩個會話bean就會被創建爲不同的數據源。這個bean可以用JNDI查找。

乾杯,

0

嘗試改變@Resource到@PersistenceContext:

@PersistenceContext(name="userEntityManager/em") 
private EntityManager em; 

更新 怎麼樣通過ejb-jar.xml中注入?定義EntityManager的EM沒有註釋,並添加以下到您的xml:

<session> 
    <ejb-name>UserEM1</ejb-name> 
    <ejb-class>com.abc.app.dao.UserEM</ejb-class> 
    <session-type>Stateless</session-type> 
    <persistence-context-ref> 
    <persistence-context-ref-name>userEntityManager/em</persistence-context-ref-name> 
    <persistence-unit-name>DataSource1</persistence-unit-name> 
    <injection-target> 
     <injection-target-class>com.abc.app.dao.UserEM</injection-target-class> 
     <injection-target-name>em</injection-target-name> 
    </injection-target> 
    </persistence-context-ref> 
</session> 

<session> 
... 
</session> 

我也注意到你有兩個企業,豆類元素。定義一個會話bean,並在其中定義會話元素。

+0

嗨喬鮑,我......「持久性的unitName未指定,並有應用程序部署3所持久性單元定義‘ABC-App.war’要麼改變應用程序只有一個持久性單元定義或爲持久單元的每個引用指定unitName。「 :-( – NawaMan

+0

我修改了我的答案 – Csaba

+0

double enterprise-beans標籤是一個複製粘貼錯誤 – NawaMan

相關問題