JBoss Tools3.1.1で生成した状態でJBoss AS 5.1でJPAを使えるようにするための追加手順
JBoss ToolsのSeam Webプロジェクトを新規に作成した状態のままではJBoss AS 5以降でJPAが正しく実行できません。これも知らないと結構はまってしまうところですね。Hello Worldの実行は成功したけれど、JPAでDBアクセスができないという場合は、以下のポイントを確認する必要があります。
ウィザードで生成された状態のcomponents.xmlでJPAのエンティティマネージャ関連のコンポーネントは以下のように定義されています。
<persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="hello"/> <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}"/>
これはpersistence.xmlを自動的に読み込んでブートスラップできないJBoss4用の設定です。JavaEE5対応のJBoss5では、以下のように修正しなくてはなりません。
<!-- <persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="hello" /> コメントアウト --> <persistence:managed-persistence-context name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/helloEntityManagerFactory" />
ここでhelloEntityManagerFactoryはpersistence.xmlで定義されたPersistenceUnitの名前です。なお、JBoss Tools3.2.0M2では正しく生成されるようになっていました。(JBossToolsで生成した雛形アプリをGlassfish v2で動作させるのに必要な手順の最後に記述したように、web.xmlでpersistence-unit-refタグを記述しておき、java:comp/envで始まるJava ENC経由で参照するのが本来は正統です。)
そもそも、components.xmlのこの設定は、Seam Managed PersistenceContextの機能を利用して、EJBではなく任意のPOJOにEntityManagerをインジェクションするために必要なのですが、Seamのこうした機能やJPAの仕様を十分知っていないと解決は難しいでしょう。Seamは簡単にアプリケーションを作れるというふれこみで初心者にもやさしいと思われがちですが、実際はすごく使いこなすのが難しいと思います。Hibernateなど複雑なフレームワークは何でも同じですが、チームに少なくとも一人は専門家がいないと厳しいですね。これにDroolsやjBPM、Webサービス関連が加わったらもっとたいへんかな。いくら便利そうなフレームワークでも、導入する際には想定されるチームのスキルも考慮する必要がありそうです。