5.6.2 アプリケーションからEntityManagerをルックアップする方法
JNDIを使用してアプリケーションからEntityManagerをルックアップする場合,さらに次の2種類の方法があります。
- EntityManagerをルックアップするクラスに@PersistenceContextを付加して,EntityManagerのリファレンスを定義する方法
- DD(web.xml)で<persistence-context-ref>タグを定義して,EntityManagerのリファレンスを定義する方法
ただし,アプリケーションサーバではEJB3.0のejb-jar.xmlを使用したJPAの定義はできません。このため,EJBでJPAを使用する場合は,1.の方法で定義してください。
それぞれの方法について説明します。
- <この項の構成>
- (1) @PersistenceContextを使用する方法
- (2) DDの<persistence-context-ref>を使用する方法
(1) @PersistenceContextを使用する方法
@PersistenceContextを使用してEntityManagerのリファレンスを定義する場合,ルックアップを実行するクラスに@PersistenceContextを付加します。
@PersistenceContextに指定できる属性について,次に説明します。
(a) name属性
name属性には,アプリケーションのコードがEntityManagerをルックアップするときのルックアップ名を指定します。指定するルックアップ名は,java:comp/envからの相対パスです。EntityManagerのルックアップ名は,必須ではありませんが,JPA仕様では,java:comp/env/persistence以下にすることが推奨されています。
@PersistenceContextのそのほかの属性については,「5.6.1 アプリケーションにEntityManagerをインジェクトする方法」と同じです。なお,拡張スコープのEntityManagerのルックアップは,Stateful Session Beanだけできます。また,一つのクラスに複数の@PersistenceContextを付加する場合には,クラスに@PersistenceContextsを付加し,そのvalue属性として@PersistenceContextの配列を指定してください。次に,@PersistenceContextを使用してSessionContextからEntityManagerをルックアップする例を示します。
@Stateless
@PersistenceContext(name="persistence/OrderEM")
public class MySessionBean implements MyInterface {
@Resource SessionContext ctx;
public void doSomething() {
・・・
EntityManager em = (EntityManager)ctx.lookup("persistence/OrderEM");
・・・
}
} |
次に,@PersistenceContextを使用してInitialContextからEntityManagerをルックアップする例を示します。
@Stateless
@PersistenceContext(name="persistence/InventoryAppMgr")
public class InventoryManagerBean implements InventoryManager {
public void updateInventory(...) {
・・・
Context initCtx = new InitialContext();
EntityManager em = (EntityManager)
initCtx.lookup("java:comp/env/persistence/InventoryAppMgr");
・・・
}
} |
(2) DDの<persistence-context-ref>を使用する方法
DDを使用してEntityManagerのリファレンスを定義する場合,DDの<persistence-context-ref>タグに次に示すタグを定義します。
(a) <persistence-context-ref-name>タグ
<persistence-context-ref-name>タグには,アプリケーションのコードがEntityManager をルックアップするときのルックアップ名を指定します。指定するルックアップ名は,java:comp/envからの相対パスです。EntityManagerのルックアップ名は,必須ではありませんが,JPA仕様ではjava:comp/env/persistence以下にすることが推奨されています。
<persistence-context-ref>タグのそのほかのタグについては,「5.6.1 アプリケーションにEntityManagerをインジェクトする方法」と同じです。ただし,JNDIルックアップでEntityManager を取得する場合,<injection-target>は指定しません。なお,拡張スコープのEntityManagerのルックアップは,Stateful Session Beanからできます。
次に,web.xmlに<persistence-context-ref>を定義する例を示します。
...
<web-app>
...
<servlet>
<display-name>InventoryManagerServlet</display-name>
<servlet-name>InventoryManagerServlet</servlet-name>
<servlet-class>com.hitachi.InventoryManagerServlet</servlet-class>
</servlet>
...
<persistence-context-ref>
<description>
Persistence context for the inventory management application.
</description>
<persistence-context-ref-name>
persistence/InventoryAppMgr
</persistence-context-ref-name>
<persistence-unit-name>InventoryManagement</persistence-unit-name>
<persistence-context-type>Transaction</persistence-context-type>
</persistence-context-ref>
...
</web-app>
... |