名前空間サポート
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-operationsJpaOperationsインターフェースを実装する 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 名前空間で定義されています。 |