名前空間サポート
XML 名前空間サポートを使用する場合、基礎となるパーサークラスが関連する Java クラスをインスタンス化します。通常、JPA アダプターの内部動作を処理する必要はありません。このセクションでは、Spring Integration が提供する XML 名前空間サポートについて説明し、XML 名前空間サポートを使用して JPA コンポーネントを構成する方法を示します。
共通の XML 名前空間設定属性
特定の構成パラメーターは、すべての JPA コンポーネントで共有されます。
auto-startup
アプリケーションコンテキストの起動中にこのコンポーネントを起動する必要があるかどうかを通知するライフサイクル属性。デフォルトは
true
です。オプション。id
基になる Spring Bean 定義を識別します。これは、
EventDrivenConsumer
またはPollingConsumer
のいずれかのインスタンスです。オプション。entity-manager-factory
アダプターが
EntityManager
を作成するために使用する JPA エンティティマネージャーファクトリへの参照。この属性、entity-manager
属性、jpa-operations
属性を提供する必要があります。entity-manager
コンポーネントが使用する JPA Entity Manager への参照。この属性、
entity-manager-factory
属性、jpa-operations
属性を提供する必要があります。通常、Spring アプリケーションコンテキストは JPA エンティティマネージャーファクトリのみを定義し、 EntityManager
は@PersistenceContext
アノテーションを使用して挿入されます。このアプローチは、Spring Integration JPA コンポーネントには適用されません。通常、JPA エンティティマネージャーファクトリを注入するのが最適ですが、EntityManager
を明示的に注入する場合は、SharedEntityManagerBean
を定義する必要があります。詳細については、関連する Javadoc を参照してください。次の例は、エンティティマネージャーファクトリを明示的に含める方法を示しています。
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> <property name="entityManagerFactory" ref="entityManagerFactoryBean" /> </bean>
jpa-operations
JpaOperations
インターフェースを実装する Bean への参照。まれに、デフォルトの実装(org.springframework.integration.jpa.core.DefaultJpaOperations
)に頼るのではなく、JpaOperations
インターフェースの独自の実装を提供することをお勧めします。jpa-operations
属性を使用する場合、JpaOperations
は必要なデータソースをラップするため、JPA エンティティマネージャーまたは JPA エンティティマネージャーファクトリを提供しないでください。entity-class
エンティティクラスの完全修飾名。この属性の正確なセマンティクスは、
persist
またはupdate
操作を実行しているかどうか、データベースからオブジェクトを取得しているかどうかによって異なります。データを取得するときに、
entity-class
属性を指定して、データベースからこの型のオブジェクトを取得することを示すことができます。その場合、クエリ属性(jpa-query
、native-query
、named-query
)を定義しないでください。データを永続化する場合、
entity-class
属性は永続化するオブジェクトの型を示します。指定しない場合(永続化操作の場合)、エンティティクラスはメッセージのペイロードから自動的に取得されます。jpa-query
使用する JPA クエリ(Java Persistence Query Language)を定義します。
native-query
使用するネイティブ SQL クエリを定義します。
named-query
名前付きクエリを参照します。名前付きクエリは、ネイティブ SQL または JPAQL のいずれかで定義できますが、基礎となる JPA 永続性プロバイダーがその区別を内部的に処理します。
JPA クエリパラメーターの提供
パラメーターを提供するには、parameter
XML エレメントを使用できます。Java Persistence Query Language(JPQL)またはネイティブ SQL クエリのいずれかに基づくクエリのパラメーターを提供できるメカニズムがあります。名前付きクエリのパラメーターを提供することもできます。
- 式ベースのパラメーター
次の例は、式ベースのパラメーターを設定する方法を示しています。
<int-jpa:parameter expression="payload.name" name="firstName"/>
- 値ベースのパラメーター
次の例は、値ベースのパラメーターを設定する方法を示しています。
<int-jpa:parameter name="name" type="java.lang.String" value="myName"/>
- 位置パラメーター
次の例は、式ベースのパラメーターを設定する方法を示しています。
<int-jpa:parameter expression="payload.name"/> <int-jpa:parameter type="java.lang.Integer" value="21"/>
トランザクション処理
すべての JPA 操作(INSERT
、UPDATE
、DELETE
など)は、実行されるたびにトランザクションがアクティブである必要があります。受信チャネルアダプターの場合、特別なことは何もする必要はありません。これは、他の受信チャネルアダプターで使用されるポーラーを使用してトランザクションマネージャーを構成する方法と同様に機能します。次の XML の例では、受信チャネルアダプターでポーラーを使用するトランザクションマネージャーを構成します。
<int-jpa:inbound-channel-adapter
channel="inboundChannelAdapterOne"
entity-manager="em"
auto-startup="true"
jpa-query="select s from Student s"
expect-single-result="true"
delete-after-poll="true">
<int:poller fixed-rate="2000" >
<int:transactional propagation="REQUIRED"
transaction-manager="transactionManager"/>
</int:poller>
</int-jpa:inbound-channel-adapter>
ただし、送信チャネルアダプターまたはゲートウェイを使用する場合は、特にトランザクションを開始する必要があります。DirectChannel
が送信アダプターまたはゲートウェイの入力チャネルであり、トランザクションが現在の実行スレッドでアクティブな場合、JPA 操作は同じトランザクションコンテキストで実行されます。次の例に示すように、この JPA 操作を新しいトランザクションとして実行するように構成することもできます。
<int-jpa:outbound-gateway
request-channel="namedQueryRequestChannel"
reply-channel="namedQueryResponseChannel"
named-query="updateStudentByRollNumber"
entity-manager="em"
gateway-type="UPDATING">
<int-jpa:parameter name="lastName" expression="payload"/>
<int-jpa:parameter name="rollNumber" expression="headers['rollNumber']"/>
<int-jpa:transactional propagation="REQUIRES_NEW"
transaction-manager="transactionManager"/>
</int-jpa:outbound-gateway>
前述の例では、送信ゲートウェイまたはアダプターのトランザクション要素がトランザクション属性を指定します。アダプターへの入力チャネルとして DirectChannel
があり、アダプターが呼び出し元と同じトランザクションコンテキストで操作を実行するようにしたい場合、この子要素の定義はオプションです。ただし、ExecutorChannel
を使用する場合は、呼び出し側クライアントのトランザクションコンテキストが伝播されないため、transactional
要素が必要です。
Spring Integration の名前空間で定義されているポーラーの transactional 要素とは異なり、発信ゲートウェイまたはアダプターの transactional 要素は JPA 名前空間で定義されています。 |