0

いくつかのデータベース操作を持つセッション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を1つだけ作成すると、期待どおりに機能します。しかし、2つ以上作成すると、次のようにデプロイ時に例外がスローされます。

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]

ここで何が起こっているのか。誰か助けてもらえますか?提案やコメントはすべて流用されます。

なわ

4

2 に答える 2

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>
...

私が知らなかったのは、ここで2つのEJBを宣言するだけでなく、アプリケーションで一意である必要がある2つの永続コンテキスト参照名も宣言しているということでした。「persistence-context-ref-name」の値も一意である必要があります。これが完了すると、アプリケーションはデプロイ可能になり、異なるデータソースで2つのセッションBeanが作成されます。BeanはJNDIで検索できます。

乾杯、

于 2012-09-11T16:17:00.820 に答える
0

@Resourceを@PersistenceContextに変更してみてください。

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

更新 ejb-jar.xmlを介したインジェクションはどうですか?アノテーションなしでEntityManageremを定義し、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>

また、2つのエンタープライズBean要素があることにも気づきました。1つだけを定義し、その中にセッション要素を含むセッションBeanを定義します。

于 2012-09-05T23:27:26.053 に答える