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



我有一个会话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]

这里发生了什么。有人能帮忙吗?任何建议或意见均适用。

纳瓦

玩了一段时间后,我找到了解决方案。这是代码。

这是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。

干杯,

尝试将@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元素。只定义一个会话bean,并在该会话bean中定义session元素。

相关内容

  • 没有找到相关文章

最新更新