1

JPAはオプションの永続性ユニットをサポートしていますか?サポートしている場合、それをどのように構成しますか?

メインデータベースである永続性ユニットが1つあります。

次に、データベースからオブジェクトを読み取ってチェックを行う別のオブジェクトを構成しました。複数のデータソースのトランザクションをいじくり回さないように、2番目のデータソースを設定しましたjta="false"

ただし、2番目のデータソースが定義されているかどうかを確認し、定義されている場合にのみ使用できるようにしたいと思います。定義されていない場合は、チェックをスキップしたいと思います。

問題は、これをオプションにする方法が見つからないことです。2番目のデータソースが設定されていないNew missing/unsatisfied dependencies場合、戦争がデプロイされたときにJbossのデプロイメントスキャナーからエラーが発生します。

service jboss.naming.context.java.secondDatasource (missing) dependents: [service jboss.persistenceunit."de.my.war#secondDatasource"] 

(ところで、私はJBoss 7.1.0を使用しており、standard.xmlでデータソースを設定しています-その情報に関連性がある場合)

ヒントはありますか?

4

2 に答える 2

4

基本的に、ほとんどの場合にJPAを使用する方法の規則であるXML構成で可能かどうかはわかりません。プログラムによるアプローチを探してみてください。

おそらく、プログラムでデータソースを JNDI リソースとしてルックアップし、見つかった場合は、EntityManager を自分で構築できます。CDIの助けを借りれば、思ったほど難しくないかもしれません。

@Produces
@MyAlterNativeEntityManager
public EntityManager getEntityManager {
    EntityManager entityManager = null;
    if(jndiLookupMySecondDatasource()){
       entityManager = buildEntityManagerProgrammatically(...);
    }
    return entityManager;
}

もちろん、データソースが見つからない場合は、空の EntityManager が返されますが、呼び出し元のコードで、初期化されているかどうかを確認し、初期化されている場合にのみ使用できます。それがあなたを正しい道に導くのに役立つことを願っています。

于 2013-03-06T12:30:00.410 に答える
1

JPA標準では:

  • 各 EntityManagerFactory (EMF) は 1 つの PersistentUnit (PU) に関連付ける必要があります。複数の PersistenceUnit を持つことも、PersistenceUnit をゼロにすることもできません。
  • 各 EntityManager (EM) インスタンスは EMF から作成されるため、単一の PU も備えています。もちろん、すべて同じ PU を使用して、EMF から複数の EM を作成できます。
  • ハードコーディングを使用して、各 EMF に対して明示的に使用する PU を構成できます

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService");

    または注釈を使用してEMFを注入することにより

    @PersistenceUnit("EmployeeService") EntityManagerFactory emf;

    または、空白のままにして、persistence.xml で構成されているデフォルトの PU を選択することもできます。

  • アノテーションを使用して EM を挿入することにより、各 EM に対して明示的に使用する PU を構成できます。ここでは、コードは EMF をまったく参照していません (コンテナーが EMF を目に見えないように参照できるようにします)。

    @PersistenceContext(unitName="EmployeeService") EntityManager em;

このすべてにおいて、オプションの PU という考えは意味がありません。JPA EM を使用している場合は、PU にコミットする必要があります。

オプション:

  1. persistence.xml を編集して、2 つの異なる物理データベース インスタンス間で同じ論理永続性ユニットを「切り替える」ようにします。完全な要件を満たしていません - 引き続き代替データ ソースから値を読み取ります。
  2. Balazs Maria Nemeth のソリューションに従って、環境変数 (「デバッグ」かどうかに関係なく) をルックアップ/挿入し、異なるデータ ソース間をプログラムでフリックします。代替データ ソースから値を読み取るため、完全な要件を満たしていません。
  3. 環境変数 (「デバッグ」かどうか) を検索/挿入し、代替 EM のコードを適切に実行/除外します。

3 は、完全な要件を満たす唯一のオプションです。例えば:

// Inject environment setting. Resource annotation works with/without CDI -  
// just doesn't give scoping support, which isn't required here.
@Resource boolean debugMode;

if (debugMode) {
    @PersistenceContext(unitName="DebugPersistenceUnit")
    EntityManager debugEM;

    Employee emp = debugEM.find(Employee.class, empId);
}

次に、web.xml または ejb.xml に env-entry を含めます。

<env-entry>
    <description>
     Only set this true in a debugging environment
    </description>
    <env-entry-name>debugMode</env-entry-name>
    <env-entry-type>java.lang.Boolean</env-entry-type>
    <env-entry-value>true</env-entry-value>
</env-entry>
于 2013-03-11T02:28:08.677 に答える