将实体管理器注入同一个类的多个bean

时间:2012-09-05 19:06:03

标签: java-ee code-injection persistence-unit

我有一个会话bean类,它有一些数据库操作。我需要使用具有多个数据库的类,因此我配置ejb-jar.xml以从该类创建会话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: org.jboss.as.jpa.injectors.PersistenceContextInjectionSource@937b07ef
    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]

这里发生了什么。有人可以帮忙吗?任何建议或意见都是适当的。

纳瓦

2 个答案:

答案 0 :(得分: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。可以使用JNDI查找bean。

干杯,

答案 1 :(得分: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>

我还注意到你有两个enterprise-beans元素。仅定义一个并定义具有该元素内的会话元素的会话bean。