第87章 JPA


JPA コンポーネント

jpa コンポーネントを使用すると、EJB 3 の Java Persistence Architecture (JPA)を使用して永続ストレージから Java オブジェクトを保存および取得できます。JPA は、OpenJPA、Hibernate、TopLink などの Object/Relational Mapping (ORM)製品をラップする標準のインターフェイスレイヤーです。

Camel on EAP デプロイメント

このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください
JBoss EAP コンテナーでの JPA コンポーネントの使用に関する詳細は、JPA との統合 を参照してください。

エンドポイントへの送信

Java エンティティー Bean を JPA プロデューサーエンドポイントに送信すると、Java エンティティー Bean をデータベースに保存できます。In メッセージのボディーは、エンティティー Bean (つまり、@Entity アノテーションを持つ POJO)またはコレクションまたはエンティティー Bean の配列であると想定されます。
ボディーがエンティティーのリストである場合は、entityType=java.util.ArrayList をプロデューサーエンドポイントに渡される設定として使用するようにしてください。
ボディーに前述のタイプの 1 つが含まれていない場合は、最初にエンドポイントの前に Message Translator を追加して、最初に必要な変換を実行します。

エンドポイントからの消費

JPA コンシューマーエンドポイントからメッセージを消費すると、データベース内のエンティティー Bean が削除される(または更新)されます。これにより、データベーステーブルを論理キューとして使用できます。コンシューマーはキューからメッセージを取得してから、それらを削除/更新してキューから論理的に削除できます。
エンティティー Bean が処理されたときに(ルーティングが完了したら)エンティティー Bean を削除したくない場合は、URI で consumeDelete=false を指定できます。これにより、エンティティーはポーリングごとに処理されます。
エンティティーでいくつかの更新を実行して処理済みとしてマークする場合(将来のクエリーから除外するなど)、メソッドに @Consumed のアノテーションを付け、エンティティー Bean の処理時にエンティティー Bean で呼び出されます(ルーティングの完了時)。
Camel 2.13 以降では、@PreConsumed を使用できます。これは、(ルーティングの前に)処理される前にエンティティー Bean で呼び出されます。

URI 形式

jpa:entityClassName[?options]
Copy to Clipboard Toggle word wrap
エンドポイントに送信する場合、Entity ClassName は任意です。指定した場合、Type Converter はボディーが正しいタイプであることを確認するのに役立ちます。
使用するには、EntityClassName は必須です。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

オプション

Expand
名前 デフォルト値 説明
entityType entityClassName URI から entityClassName を上書きします。
persistenceUnit camel デフォルトで使用される JPA 永続ユニット。
consumeDelete true JPA コンシューマーのみ: true の場合、エンティティーは消費後に削除されます。false の場合、エンティティーは削除されません。
consumeLockEntity true JPA consumer only: ポーリングによる結果の処理中に、各エンティティー Bean に排他ロックを設定するかどうかを指定します。
flushOnSend true JPA プロデューサーのみ: エンティティー Bean が永続化された後に EntityManager をフラッシュします。
maximumResults -1 JPA コンシューマーのみ: クエリーで取得する結果の最大数を設定し ます
transactionManager null このオプションはレジストリーベースであり、指定された transactionManager を正しく検索できるように # 表記が必要です(例: transactionManager=#myTransactionManager使用するトランザクションマネージャーを指定します。指定のない場合、Apache Camel はデフォルトで JpaTransactionManager を使用します。JTA トランザクションマネージャーの設定に使用できます(EJB コンテナーとの統合)。
consumer.delay 500 JPA コンシューマーのみ: 各ポーリング間の遅延(ミリ秒単位)。
consumer.initialDelay 1000 JPA コンシューマーのみ: ポーリングの開始前の Milliseconds。
consumer.useFixedDelay false JPA コンシューマーのみ: true に設定すると、ポーリング間の固定遅延が使用されます。それ以外の場合は、固定レートが使用されます。詳細は、JDK の ScheduledExecutorService を参照してください。
maxMessagesPerPoll 0 Apache Camel 2.0:JPA コンシューマーのみ: ポーリングごとに収集するメッセージの最大数を定義する整数値。デフォルトでは最大値は設定されていません。サーバーの起動時に多数のメッセージをポーリングしないようにするために使用できます。無効にするには 0 または負の値を設定します。
consumer.query JPA コンシューマーのみ: データを消費するときにカスタムクエリーを使用します。
consumer.namedQuery JPA コンシューマーのみ: データを消費する場合に名前付きクエリーを使用するには、以下を実行します。
consumer.nativeQuery JPA コンシューマーのみ: データを消費するときにカスタムネイティブクエリーを使用するには、以下を実行します。
consumer.parameters Camel 2.12: JPA コンシューマーのみ: クエリーの構築に使用されるパラメーターマップ。パラメーターは Map のインスタンスで、キーは String で、値は Object です。これは一般的なタイプ java.util.Map<String, Object> であることが期待されます。ここで、キーは指定の JPA クエリーの名前付きパラメーターで、値は選択する対応する有効な値です。
consumer.resultClass Camel 2.7: JPA consumer only: 返されたペイロードのタイプを定義します( entityManager.createNativeQuery (nativeQuery, resultClass)entityManager.createNativeQuery (nativeQuery))。このオプションを指定しないと、オブジェクトアレイが返されます。データを消費するときにネイティブクエリーと併用する場合にのみ影響があります。
consumer.transacted false Camel 2.7.5/2.8.3/2.9: JPA コンシューマーのみ: トランザクションモードでコンシューマーを実行するかどうか。これにより、バッチ全体が処理されたときに、すべてのメッセージがコミットまたはロールバックされます。デフォルトの動作(false)は、以前に処理されたすべてのメッセージをコミットし、最後に失敗したメッセージのみをロールバックすることです。
consumer.lockModeType WRITE Camel 2.11.2/2.12: コンシューマーにロックモードを設定するには、以下を行います。使用できる値は enum javax.persistence.LockModeType で定義されます。Camel 2.13 以降、デフォルト値は PESSIMISTIC_WRITE に変更されてい ます。
consumer.SkipLockedEntity
false
Camel 2.13: ロック時に NOWAIT を使用し、エンティティーをサイレントにスキップするかどうかを設定します。
usePersist false Camel 2.5: JPA producer only: entityManager.merge (entity) の代わりに entityManager.persist (entity) を使用することを示します。注記: entityManager.persist (entity) は分離されたエンティティーに対して機能しません(EntityManager は INSERT クエリーの代わりに UPDATE を実行する必要があります)。
joinTransaction
true
Camel 2.12.3: camel-jpa は、Camel 2.12 以降からデフォルトでトランザクションに参加します。このオプションを使用してこれをオフにすることができます。たとえば、LOCAL_RESOURCE を使用し、トランザクションが JPA プロバイダーでは機能しません。このオプションは、すべてのエンドポイントに設定する代わりに、JpaComponent でグローバルに設定することもできます。
usePassedInEntityManager
false
Camel 2.12.4/2.13.1: JPA producer only。true の場合、Camel はコンポーネント/エンドポイントで設定されたエンティティーマネージャーではなく、ヘッダー JpaConstants.ENTITYMANAGER からの EntityManager を使用します。これにより、エンドユーザーは、使用するエンティティーマネージャーを制御できます。
sharedEntityManager
false
Camel 2.16: コンシューマー/プロデューサーに Spring の SharedEntityManager を使用するかどうか。エンティティーマネージャーを共有し、トランザクションの組み合わせが適切ではないため、このオプションが true の場合は、joinTransaction=false を設定することが推奨されます。

メッセージヘッダー

Apache Camel は以下のメッセージヘッダーをエクスチェンジに追加します。
Expand
ヘッダー タイプ 説明
CamelEntityManager EntityManager Camel 2.12: JPA consumer / Camel 2.12.2: JPA producer: JpaConsumer または JpaProducer によって使用される JPA EntityManager オブジェクト。

EntityManagerFactory の設定

特定の EntityManagerFactory インスタンスを使用するように JPA コンポーネントを設定することを強く推奨します。これを行わないと、各 JpaEndpoint は独自の EntityManagerFactory インスタンスを自動作成します。たとえば、以下のように myEMFactory エンティティーマネージャーファクトリーを参照する JPA コンポーネントをインスタンス化できます。
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
   <property name="entityManagerFactory" ref="myEMFactory"/>
</bean>
Copy to Clipboard Toggle word wrap
Camel 2.3 では、JpaComponent はレジストリーから EntityManagerFactory を自動的に検索します。つまり、上記のように JpaComponent でこれを設定する必要はありません。あいまいさがある場合にのみこれを実行する必要があります。この場合、Camel は WARN をログに記録します。

TransactionManager の設定

Camel 2.3 以降、JpaComponent はレジストリーから TransactionManager を自動的に検索します。Camel が登録された TransactionManager インスタンスが見つからない場合は、TransactionTemplate を検索し、そこから TransactionManager の抽出を試みます。レジストリーで利用可能な TransactionTemplate がない場合、JpaEndpointTransactionManager の独自のインスタンスを自動作成します。
TransactionManager の複数のインスタンスが見つかった場合、Camel は WARN メッセージをログに記録します。このような場合は、以下のように myTransactionManager トランザクションマネージャーを参照する JPA コンポーネントをインスタンス化して明示的に設定する必要がある場合があります。
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
   <property name="entityManagerFactory" ref="myEMFactory"/>
   <property name="transactionManager" ref="myTransactionManager"/>
</bean>
Copy to Clipboard Toggle word wrap

名前付きクエリーでのコンシューマーの使用

選択したエンティティーのみを使用する場合は、consumer.namedQuery URI クエリーオプションを使用できます。まず、JPA Entity クラスで名前付きクエリーを定義する必要があります。
@Entity
@NamedQuery(name = "step1", query = "select x from MultiSteps x where x.step = 1")
public class MultiSteps {
   ...
}
Copy to Clipboard Toggle word wrap
その後、以下のようにコンシューマー URI を定義できます。
from("jpa://org.apache.camel.examples.MultiSteps?consumer.namedQuery=step1")
.to("bean:myBusinessLogic");
Copy to Clipboard Toggle word wrap

クエリーでのコンシューマーの使用

選択したエンティティーのみを使用する場合は、consumer.query URI クエリーオプションを使用できます。クエリーオプションを定義するだけで済みます。
from("jpa://org.apache.camel.examples.MultiSteps?consumer.query=select o from org.apache.camel.examples.MultiSteps o where o.step = 1")
.to("bean:myBusinessLogic");
Copy to Clipboard Toggle word wrap

ネイティブクエリーでのコンシューマーの使用

選択したエンティティーのみを使用する場合は、consumer.nativeQuery URI クエリーオプションを使用できます。ネイティブクエリーオプションを定義するだけで済みます。
from("jpa://org.apache.camel.examples.MultiSteps?consumer.nativeQuery=select * from MultiSteps where step = 1")
.to("bean:myBusinessLogic");
Copy to Clipboard Toggle word wrap
native クエリーオプションを使用すると、メッセージボディーにオブジェクトアレイを受け取ります。

JPA を使用してトレースされたメッセージをデータベースに保存する例は、トレーサーの例を参照してください。

JPA ベースのべき等リポジトリーの使用

このセクションでは、JPA ベースのべき等リポジトリーを使用します。
まず、persistence.xml ファイルで persistence-unit を設定する必要があります。
<persistence-unit name="idempotentDb" transaction-type="RESOURCE_LOCAL">
   <class>org.apache.camel.processor.idempotent.jpa.MessageProcessed</class>
 
   <properties>
     <property name="openjpa.ConnectionURL" value="jdbc:derby:target/idempotentTest;create=true"/>
     <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
     <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
     <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
   </properties>
 </persistence-unit>
Copy to Clipboard Toggle word wrap
次に、org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository によって使用される org.springframework.orm.jpa.JpaTemplate を設定する必要があります。
<!-- this is standard spring JPA configuration -->
 <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
     <property name="entityManagerFactory" ref="entityManagerFactory"/>
 </bean>
 
 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
     <!-- we use idempotentDB as the persitence unit name defined in the persistence.xml file -->
     <property name="persistenceUnitName" value="idempotentDb"/>
 </bean>
Copy to Clipboard Toggle word wrap
その後、org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository を設定できます。
<!-- we define our jpa based idempotent repository we want to use in the file consumer -->
 <bean id="jpaStore" class="org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository">
     <!-- Here we refer to the spring jpaTemplate -->
     <constructor-arg index="0" ref="jpaTemplate"/>
     <!-- This 2nd parameter is the name  (= a cateogry name).
          You can have different repositories with different names -->
     <constructor-arg index="1" value="FileConsumer"/>
 </bean>
Copy to Clipboard Toggle word wrap
最後に、Spring XML ファイルで JPA idempotent リポジトリーを作成することもできます。
<camelContext xmlns="http://camel.apache.org/schema/spring">	
    <route id="JpaMessageIdRepositoryTest">
        <from uri="direct:start" />
        <idempotentConsumer messageIdRepositoryRef="jpaStore">
            <header>messageId</header>
            <to uri="mock:result" />
        </idempotentConsumer>
    </route>
</camelContext>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat