クラス PersistenceAnnotationBeanPostProcessor

java.lang.ObjectSE
org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
実装されたすべてのインターフェース:
SerializableSEBeanRegistrationAotProcessorAwareBeanFactoryAwareBeanPostProcessorDestructionAwareBeanPostProcessorInstantiationAwareBeanPostProcessorMergedBeanDefinitionPostProcessorOrderedPriorityOrdered

対応する JPA リソース EntityManagerFactoryEE および EntityManagerEE の注入のために、PersistenceUnitEE および PersistenceContextEE アノテーションを処理する BeanPostProcessor。Spring で管理されたオブジェクト内のそのようなアノテーション付きフィールドまたはメソッドは、自動的に挿入されます。

このポストプロセッサーは、アノテーション付きフィールドまたはメソッドがそのように宣言されている場合、EntityManagerFactory および EntityManager のサブインターフェースを挿入します。実際の型は早期に検証されますが、共有(「トランザクション」) EntityManager 参照は例外です。この場合、型の不一致が最初の実際の呼び出し時と同じくらい遅く検出される可能性があります。

メモ: 現在の実装では、PersistenceAnnotationBeanPostProcessor は、"unitName" 属性で @PersistenceUnit および @PersistenceContext のみをサポートするか、属性をまったくサポートしません(デフォルトのユニットの場合)。それらのアノテーションがクラスレベルで "name" 属性とともに存在する場合、(Jakarta EE 仕様に従って)デプロイヒントとしてのみ機能するため、単に無視されます。

このポストプロセッサーは、Spring アプリケーションコンテキストで定義された EntityManagerFactory Bean(デフォルト)を取得するか、JNDI から EntityManagerFactory 参照(「永続性ユニット参照」)を取得できます。Bean の場合、永続ユニット名は実際のデプロイ済みユニットと照合され、デプロイ済みの名前が見つからない場合は Bean 名がフォールバックユニット名として使用されます。通常、このような EntityManagerFactory Bean のセットアップには、Spring の LocalContainerEntityManagerFactoryBean が使用されます。代わりに、そのような Bean は JNDI からも入手できます。jee:jndi-lookup XML 構成要素を使用します(Bean 名がリクエストされたユニット名と一致する)。どちらの場合も、ポストプロセッサーの定義は次のように単純になります。

 <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
JNDI の場合は、このポストプロセッサーの "persistenceUnits" map で対応する JNDI 名を指定します。通常、Jakarta EE デプロイ記述子の一致する persistence-unit-ref エントリを使用します。デフォルトでは、これらの名前は、"java:comp/env/" 名前空間にある(Jakarta EE resource-ref 規則に従って)リソース参照と見なされます。例:
 <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
   <property name="persistenceUnits">
     <map/gt;
       <entry key="unit1" value="persistence/unit1"/>
       <entry key="unit2" value="persistence/unit2"/>
     </map/gt;
   </property>
 </bean>
この場合、指定された永続性ユニットは、Spring 定義の Bean ではなく、常に JNDI で解決されます。永続クラスのウィービングを含む永続ユニットデプロイ全体は、Jakarta EE サーバーに依存します。永続コンテキスト(つまり、EntityManager 参照)は、サーバーが提供する EntityManagerFactory 参照に基づいて構築され、トランザクション EntityManager 処理のために Spring の独自のトランザクション同期機能を使用します(通常、境界の Spring の @Transactional アノテーションとバックエンドとしての JtaTransactionManager を使用します)。

Jakarta EE サーバーの独自の EntityManager 処理を希望する場合は、このポストプロセッサーの "persistenceContexts" map(または "extendedPersistenceContexts" map にエントリを指定します。通常は、Jakarta EE デプロイ記述子に一致する persistence-context-ref エントリを指定します。次に例を示します。

 <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
   <property name="persistenceContexts">
     <map/gt;
       <entry key="unit1" value="persistence/context1"/>
       <entry key="unit2" value="persistence/context2"/>
     </map/gt;
   </property>
 </bean>
アプリケーションがそもそも EntityManager 参照のみを取得する場合は、これだけを指定する必要があります。EntityManagerFactory 参照も必要な場合は、"persistenceUnits" と "persistenceContexts" の両方のエントリを指定し、一致する JNDI ロケーションをポイントします。

注: 一般に、EXTENDED EntityManagers を STATELESS Bean に注入しないでください。つまり、スコープ 'singleton'(Spring のデフォルトスコープ)で定義された Spring Bean で型 EXTENDED の @PersistenceContext を使用しないでください。拡張 EntityManagers それゆえ、彼らは(Spring 管理シングルトンが通常です)同時にアクセス Bean に使用してはならない、スレッドセーフではありません

メモ: デフォルトの PersistenceAnnotationBeanPostProcessor は、"context:annotation-config" および "context:component-scan" XML タグによって登録されます。カスタム PersistenceAnnotationBeanPostProcessor Bean 定義を指定する場合は、デフォルトのアノテーション構成を削除するか、そこでオフにします。

導入:
2.0
作成者:
Rod Johnson, Juergen Hoeller, Stephane Nicoll, Phillip Webb
関連事項:
  • コンストラクターの詳細

    • PersistenceAnnotationBeanPostProcessor

      public PersistenceAnnotationBeanPostProcessor()
  • メソッドの詳細

    • setJndiTemplate

      public void setJndiTemplate(ObjectSE jndiTemplate)
      JNDI ルックアップに使用する JNDI テンプレートを設定します。
      関連事項:
    • setJndiEnvironment

      public void setJndiEnvironment(PropertiesSE jndiEnvironment)
      JNDI ルックアップに使用する JNDI 環境を設定します。
      関連事項:
    • setResourceRef

      public void setResourceRef(boolean resourceRef)
      ルックアップが Jakarta EE コンテナーで発生するかどうか、つまり、JNDI 名にプレフィックス "java:comp/env/" を追加する必要があるかどうかを設定します。PersistenceAnnotationBeanPostProcessor のデフォルトは "true" です。
      関連事項:
    • setPersistenceUnits

      public void setPersistenceUnits(MapSE<StringSE,StringSE> persistenceUnits)
      EntityManagerFactory ルックアップの永続性ユニットを、永続性ユニット名から永続性ユニット JNDI 名へのマップ(EntityManagerFactory インスタンスに解決する必要がある)として指定します。

      ここで指定する JNDI 名は、Jakarta EE デプロイ記述子の persistence-unit-ref エントリを参照し、ターゲット永続性ユニットと一致する必要があります。

      アノテーションでユニット名が指定されていない場合、default persistence unit に指定された値(デフォルトでは、空の文字列にマップされた値)、または 1 つしかない場合は単一の永続性ユニットが使用されます。

      これは主に Jakarta EE 環境での使用を目的としており、すべてのルックアップは標準の JPA アノテーションによって駆動され、すべての EntityManagerFactory 参照は JNDI から取得されます。このようなシナリオでは、個別の EntityManagerFactory Bean 定義は必要ありません。

      対応する "persistenceContexts "/"extendedPersistenceContexts" " が指定されていない場合、@PersistenceContext はここで定義された EntityManagerFactory 上に構築された EntityManagers に解決されます。これらは Spring 管理の EntityManagers であり、Spring の機能に基づいてトランザクション同期を実装することに注意してください。Jakarta EE サーバー独自の EntityManager を使用する場合処理には、対応する "persistenceContexts"/"extendedPersistenceContexts" " を指定します。

    • setPersistenceContexts

      public void setPersistenceContexts(MapSE<StringSE,StringSE> persistenceContexts)
      EntityManager ルックアップのトランザクション永続コンテキストを、永続ユニット名から永続コンテキスト JNDI 名へのマップ(EntityManager インスタンスに解決する必要がある)として指定します。

      ここで指定する JNDI 名は、Jakarta EE デプロイ記述子の persistence-context-ref エントリを参照し、ターゲット永続性ユニットと一致し、永続性コンテキスト型 Transaction で設定されている必要があります。

      アノテーションでユニット名が指定されていない場合、default persistence unit に指定された値(デフォルトでは、空の文字列にマップされた値)、または 1 つしかない場合は単一の永続性ユニットが使用されます。

      これは主に Jakarta EE 環境での使用を目的としており、すべてのルックアップは標準の JPA アノテーションによって駆動され、すべての EntityManager 参照は JNDI から取得されます。このようなシナリオでは、個別の EntityManagerFactory Bean 定義は必要ありません。すべての EntityManager 処理は、Jakarta EE サーバー自体によって行われます。

    • setExtendedPersistenceContexts

      public void setExtendedPersistenceContexts(MapSE<StringSE,StringSE> extendedPersistenceContexts)
      EntityManager ルックアップの拡張永続コンテキストを、永続ユニット名から永続コンテキスト JNDI 名へのマップ(EntityManager インスタンスに解決する必要がある)として指定します。

      ここで指定する JNDI 名は、Jakarta EE デプロイ記述子の persistence-context-ref エントリを参照し、ターゲット永続性ユニットと一致し、永続性コンテキスト型 Extended で設定されている必要があります。

      アノテーションでユニット名が指定されていない場合、default persistence unit に指定された値(デフォルトでは、空の文字列にマップされた値)、または 1 つしかない場合は単一の永続性ユニットが使用されます。

      これは主に Jakarta EE 環境での使用を目的としており、すべてのルックアップは標準の JPA アノテーションによって駆動され、すべての EntityManager 参照は JNDI から取得されます。このようなシナリオでは、個別の EntityManagerFactory Bean 定義は必要ありません。すべての EntityManager 処理は、Jakarta EE サーバー自体によって行われます。

    • setDefaultPersistenceUnitName

      public void setDefaultPersistenceUnitName(@Nullable StringSE unitName)
      @PersistenceUnit / @PersistenceContext アノテーションでユニット名が指定されていない場合に使用される、デフォルトの永続ユニット名を指定します。

      これは主にアプリケーションコンテキストでのルックアップを目的としており、ターゲット永続性ユニット名(通常は Bean 名と一致)を示しますが、"persistenceUnits"/"persistenceContexts"/"extendedPersistenceContexts" マップでのルックアップにも適用され、空の文字列のマッピングが重複する必要がなくなります。

      デフォルトでは、Spring アプリケーションコンテキストで単一の EntityManagerFactory Bean があるかどうかをチェックします。そのようなファクトリが複数ある場合は、このデフォルトの永続性ユニット名を指定するか、アノテーションで名前付き永続性ユニットを明示的に参照してください。

    • setOrder

      public void setOrder(int order)
    • getOrder

      public int getOrder()
      インターフェースからコピーされた説明: Ordered
      このオブジェクトの順序値を取得します。

      値が高いほど、優先度は低くなります。結果として、最も低い値を持つオブジェクトが最高の優先度を持ちます(サーブレット load-on-startup の値に多少似ています)。

      同じ順序の値は、影響を受けるオブジェクトの任意のソート位置になります。

      次で指定:
      インターフェース OrderedgetOrder 
      戻り値:
      オーダー額
      関連事項:
    • setBeanFactory

      public void setBeanFactory(BeanFactory beanFactory)
      インターフェースからコピーされた説明: BeanFactoryAware
      所有ファクトリを Bean インスタンスに提供するコールバック。

      通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet() またはカスタム init-method などの初期化コールバックの前に呼び出されます。

      次で指定:
      インターフェース BeanFactoryAwaresetBeanFactory 
      パラメーター:
      beanFactory - 所有 BeanFactory(非 null)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。
      関連事項:
    • postProcessMergedBeanDefinition

      public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, ClassSE<?> beanType, StringSE beanName)
      インターフェースからコピーされた説明: MergedBeanDefinitionPostProcessor
      指定された Bean の指定されたマージ済み Bean 定義を後処理します。
      次で指定:
      インターフェース MergedBeanDefinitionPostProcessorpostProcessMergedBeanDefinition 
      パラメーター:
      beanDefinition - Bean のマージされた Bean 定義
      beanType - 管理対象 Bean インスタンスの実際の型
      beanName - Bean の名前
      関連事項:
    • resetBeanDefinition

      public void resetBeanDefinition(StringSE beanName)
      インターフェースからコピーされた説明: MergedBeanDefinitionPostProcessor
      指定された名前の Bean 定義がリセットされ、このポストプロセッサーが影響を受ける Bean のメタデータをクリアする必要があるという通知。

      デフォルトの実装は空です。

      次で指定:
      インターフェース MergedBeanDefinitionPostProcessorresetBeanDefinition 
      パラメーター:
      beanName - Bean の名前
      関連事項:
    • processAheadOfTime

      public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean)
      インターフェースからコピーされた説明: BeanRegistrationAotProcessor
      指定された RegisteredBean インスタンスを事前に処理し、コントリビューションまたは null を返します。

      プロセッサーは、任意の手法を自由に使用して、特定のインスタンスを分析できます。ほとんどの場合、リフレクションを使用して、コントリビューションで使用するフィールドまたはメソッドを見つけます。コントリビューションは通常、AOT 最適化アプリケーションの実行時に使用できるソースコードまたはリソースファイルを生成します。

      指定されたインスタンスがプロセッサーに関連していない場合は、null コントリビューションを返す必要があります。

      次で指定:
      インターフェース BeanRegistrationAotProcessorprocessAheadOfTime 
      パラメーター:
      registeredBean - 処理する登録済み Bean
      戻り値:
      BeanRegistrationAotContribution または null
    • postProcessProperties

      public PropertyValues postProcessProperties(PropertyValues pvs, ObjectSE bean, StringSE beanName)
      インターフェースからコピーされた説明: InstantiationAwareBeanPostProcessor
      ファクトリが指定された Bean に適用する前に、指定されたプロパティ値を後処理します。

      デフォルトの実装は、指定された pvs をそのまま返します。

      次で指定:
      インターフェース InstantiationAwareBeanPostProcessorpostProcessProperties 
      パラメーター:
      pvs - ファクトリが適用しようとしているプロパティ値 (非 null)
      bean - Bean インスタンスは作成されましたが、そのプロパティはまだ設定されていません
      beanName - Bean の名前
      戻り値:
      指定された Bean に適用する実際のプロパティ値(渡された PropertyValues インスタンスにすることができます)、またはプロパティの入力をスキップする null 
    • postProcessBeforeDestruction

      public void postProcessBeforeDestruction(ObjectSE bean, StringSE beanName)
      インターフェースからコピーされた説明: DestructionAwareBeanPostProcessor
      破棄する前に、この BeanPostProcessor を指定の Bean インスタンスに適用します。カスタム破棄コールバックを呼び出します。

      DisposableBean の destroy およびカスタム destroy メソッドのように、このコールバックは、コンテナーがライフサイクルを完全に管理する Bean にのみ適用されます。これは通常、シングルトンとスコープ Bean の場合です。

      次で指定:
      インターフェース DestructionAwareBeanPostProcessorpostProcessBeforeDestruction 
      パラメーター:
      bean - 破棄される Bean インスタンス
      beanName - Bean の名前
      関連事項:
    • requiresDestruction

      public boolean requiresDestruction(ObjectSE bean)
      インターフェースからコピーされた説明: DestructionAwareBeanPostProcessor
      指定された Bean インスタンスがこのポストプロセッサーによる破棄を必要とするかどうかを判断します。

      デフォルトの実装は true を返します。DestructionAwareBeanPostProcessor の 5 以前の実装がこのメソッドの具体的な実装を提供しない場合、Spring は true も暗黙のうちに想定します。

      次で指定:
      インターフェース DestructionAwareBeanPostProcessorrequiresDestruction 
      パラメーター:
      bean - チェックする Bean インスタンス
      戻り値:
      DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(java.lang.Object, java.lang.String) が最終的にこの Bean インスタンスのために呼び出されることになっている場合は true、または不要な場合は false 
    • getPersistenceUnit

      @Nullable protected EntityManagerFactoryEE getPersistenceUnit(@Nullable StringSE unitName)
      "persistenceUnits" マップで定義されているように、指定されたユニット名の指定された永続性ユニットを返します。
      パラメーター:
      unitName - 永続性ユニットの名前
      戻り値:
      対応する EntityManagerFactory、または見つからない場合は null 
      関連事項:
    • getPersistenceContext

      @Nullable protected EntityManagerEE getPersistenceContext(@Nullable StringSE unitName, boolean extended)
      "persistenceContexts" (または "extendedPersistenceContexts" )マップで定義された、指定されたユニット名の指定された永続化コンテキストを返します。
      パラメーター:
      unitName - 永続性ユニットの名前
      extended - 拡張永続コンテキストを取得するかどうか
      戻り値:
      対応する EntityManager、または見つからない場合は null 
      関連事項:
    • findEntityManagerFactory

      protected EntityManagerFactoryEE findEntityManagerFactory(@Nullable StringSE unitName, @Nullable StringSE requestingBeanName) throws NoSuchBeanDefinitionException
      現在の Spring アプリケーションコンテキストで指定された名前の EntityManagerFactory を検索します。ユニット名が指定されていない場合は、単一のデフォルト EntityManagerFactory(存在する場合)にフォールバックします。
      パラメーター:
      unitName - 永続性ユニットの名前 (null または空の場合があります)
      requestingBeanName - リクエストしている Bean の名前
      戻り値:
      EntityManagerFactory
      例外:
      NoSuchBeanDefinitionException - コンテキストにそのような EntityManagerFactory がない場合
    • findNamedEntityManagerFactory

      protected EntityManagerFactoryEE findNamedEntityManagerFactory(StringSE unitName, @Nullable StringSE requestingBeanName) throws NoSuchBeanDefinitionException
      現在の Spring アプリケーションコンテキストで、指定された名前の EntityManagerFactory を検索します。
      パラメーター:
      unitName - 永続性ユニットの名前 (空になることはありません)
      requestingBeanName - リクエストしている Bean の名前
      戻り値:
      EntityManagerFactory
      例外:
      NoSuchBeanDefinitionException - コンテキストにそのような EntityManagerFactory がない場合
    • findDefaultEntityManagerFactory

      protected EntityManagerFactoryEE findDefaultEntityManagerFactory(@Nullable StringSE requestingBeanName) throws NoSuchBeanDefinitionException
      Spring アプリケーションコンテキストで単一のデフォルト EntityManagerFactory を検索します。
      戻り値:
      デフォルトの EntityManagerFactory
      例外:
      NoSuchBeanDefinitionException - コンテキストに単一の EntityManagerFactory がない場合
    • lookup

      protected <T> T lookup(StringSE jndiName, ClassSE<T> requiredType) throws ExceptionSE
      名前で指定されたリソースの JNDI 検索を実行します。

      JNDI 名が特定の永続性ユニットにマップされるときに、EntityManagerFactory および EntityManager ルックアップのために呼び出されます。

      パラメーター:
      jndiName - 検索する JNDI 名
      requiredType - オブジェクトの必要な型
      戻り値:
      取得したオブジェクト
      例外:
      ExceptionSE - JNDI ルックアップが失敗した場合