名前空間サポート

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-querynative-querynamed-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 操作(INSERTUPDATEDELETE など)は、実行されるたびにトランザクションがアクティブである必要があります。受信チャネルアダプターの場合、特別なことは何もする必要はありません。これは、他の受信チャネルアダプターで使用されるポーラーを使用してトランザクションマネージャーを構成する方法と同様に機能します。次の 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 名前空間で定義されています。