5.3.3 CDI Managed BeanでのJPA利用
11-10以降では,EJBやWebコンポーネントに注入されるCDI Managed BeanでのJPAの利用をサポートします。ただし,シングルトンセッションビーンに注入されるCDI Managed BeanでのJPAの利用はサポートしません。
サポート範囲を次の表に示します。
EntityManagerFactory/EntityManagerの取得方法 |
11-10 |
11-20以降(ejbserver.jpa.cdiEnabledがfalse) |
11-20以降(ejbserver.jpa.cdiEnabledがtrue) |
||
---|---|---|---|---|---|
EntityManagerFactory |
javax.persistence.Persistenceインタフェースの使用 |
○ |
○ |
○ |
|
DDによる参照の定義 |
EJB(ejb-jar.xml) |
× |
× |
× |
|
Webコンポーネント(web.xml) |
△ |
△ |
△ |
||
@PersistenceUnitによる注入 |
× |
× |
○ |
||
EntityManager |
DDによる参照の定義 |
EJB(ejb-jar.xml) |
× |
× |
× |
Webコンポーネント(web.xml) |
△ |
△ |
△ |
||
@PersistenceContextによる注入 |
× |
× |
○ |
サポート範囲の詳細を次に示します。
- 〈この項の構成〉
(1) javax.persistence.Persistenceインタフェースの使用
javax.persistence.Persistenceインタフェースを利用して,EntityManagerFactoryを取得できます。
(2) DDによる参照の定義
-
EJB
EJB3.0のejb-jar.xmlがサポートされないため,ejb-jar.xmlによる永続化ユニット,永続化コンテキストの参照を定義できません。
-
Webコンポーネント
web.xmlのpersistence-unit-refタグやpersistence-context-refタグを利用して,永続化ユニット,永続化コンテキストの参照を定義し,その定義を利用できます。このとき,injection-targetタグを利用したインジェクションは利用できません。
(3) @PersistenceUnitや@PersistenceContextによる注入
11-10以前では,CDI Managed Bean(それに関連づくインターセプタ含む)で@PersistenceUnitや@PersistenceContextでの定義はできません。
11-20以降では,ejbserver.jpa.cdiEnabledプロパティがtrue(デフォルトでtrue)の場合,CDI Managed Bean(それに関連づくインターセプタ含む)で@PersistenceUnitや@PersistenceContextでの定義ができます。
(a) 指定できる永続化ユニット
@PersistenceUnitや@PersistenceContextのunitName属性で指定できる永続化ユニットは,CDI Managed Beanが含まれるモジュールによって次のように分かれます。なお,どの永続化ユニットが使用されるかは「5.10.2 永続化ユニット名の参照スコープ」のルールが適用されます。
-
WAR内のCDI Managed Bean
unitName属性で次の永続化ユニットを指定できます。それ以外の永続化ユニットを指定した場合,EntityManagerFactoryやEntityManagerは注入されません。
-
そのCDI Managed Beanを含むWARに定義した永続化ユニット
-
EARに定義した永続化ユニット
-
-
EJB-JAR内のCDI Managed Bean
unitName属性で次の永続化ユニットを指定できます。それ以外の永続化ユニットを指定した場合,EntityManagerFactoryやEntityManagerは注入されません。
-
そのCDI Managed Beanを含むEJB-JARに定義した永続化ユニット
-
EARに定義した永続化ユニット
-
-
ライブラリJAR内のCDI Managed Bean
unitName属性で次の永続化ユニットを指定できます。それ以外の永続化ユニットを指定した場合,EntityManagerFactoryやEntityManagerは注入されません。
-
EARに定義した永続化ユニット
-
(4) 注意事項
-
SecurityManagerを使用する場合,CDI Managed Bean上でEntityManagerFactory/EntityManagerを参照できません。CDI Managed Beanで生成したEntityManagerFactory/EntityManagerを使用する場合は,CDI Managed Bean以外のクラスからオブジェクトを参照してください。
-
CDI Managed Beanに定義した@PersistenceContextのtype属性にPersistenceContextType.EXTENDEDを指定した場合,EntityManagerは注入されません。
-
CDI Managed Beanで@PersistenceUnitや@PersistenceContextでの定義をした場合,name属性の名前はJNDI名前空間(java:comp/env)に登録されません。そのため,name属性の名前でJNDIを使用してEntityManagerFactoryやEntityManagerをルックアップできません。