JSF2.0+JPA2.0+eclipse 構築編:JPAでの例外の解消(その4)

引き続き例外の調査です。

前回Glassfishのサーバを立ててデプロイしてみて、persistence.xmlのtransaction-typeをRESOURCE_LOCALにしているために起動に失敗している、ということが分かりました。

今回はここをJTAに変えて動作させてみます。

データソースの確認

確かGlassfishサーバはサンプルのデータソースがデフォルトで登録されていた気がします。
管理コンソールで確認しましょう。
なおGlassfishサーバを起動していない場合は前回のエントリを見て起動しておいて下さい。

管理コンソールには以下のURLでアクセス出来ます。
http://localhost:4848/

トップ画面ではけっこう待たないといけません。これはなんとかならんものか。

さて管理コンソールの左側のツリーを展開してデータソースを確認します。

リソース>JDBCJDBCリソース

ふむ。jdbc/__defaultというデータソースがありますね。これを使いましょう。

Derbyの起動

jdbc/__defaultはローカルホストの1527ポートのDerbyサーバに接続します。DerbyはJavaで作られたRDB製品で、Glassfishに同梱されています。
というわけでDerbyを起動しましょう。
ターミナルで以下のフォルダに移動します。

<GlassfishのZIPを解凍して現れるフォルダ>/javadb/bin

ここで以下のコマンドを実行。

./startNetworkServer

すると

Error: DERBY_HOME is not set. Please set the DERBY_HOME environment variable
to the location of your Derby installation.

あら。環境変数を設定しろって怒られました。
設定します。

export DERBY_HOME=<GlassfishのZIPを解凍して現れるフォルダ>/javadb

再度起動コマンドを実行!

./startNetworkServer

すると

2011-02-11 18:59:37.084 GMT : セキュリティーマネージャーが Basic サーバーセキュリティーポリシーを使用してインストールされました。
2011-02-11 18:59:37.477 GMT : Apache Derby Network Server - 10.5.3.0 - (802917) ???????????????????????? 1527 ???????∂?????????????????∫??????????‰∫?????????????

あら、文字化け。ターミナルの環境設定がまずいらしい・・・一部が化けるってどーゆーこと?たぶんメッセージの出所がちがうんでしょうねぇ。

このままじゃアレなので、Glassfishの管理コンソールからpingを打って、Derbyの起動を確認しましょう。

pingが通りました。準備は完了かな。

persistence.xmlの修正

eclipseのプロジェクトに戻り、persistence.xmlを書き直します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="pu" transaction-type="JTA">
        <jta-data-source>jdbc/__default</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="database"/>
            <property name="eclipselink.logging.level.sql" value="FINE"/>
        </properties>
    </persistence-unit>
</persistence>

変えたのは以下。

  • transaction-typeをJTA
  • jta-data-sourceタグを追加
  • 接続情報を設定していた4つのpropertyタグを削除

WARの作成、デプロイ

ここの手順は前回のエントリを参照して下さい。

結果の確認

おっ!sandbox.war_deployedというファイルが出来てます!
ではWebアプリにアクセスしてみましょう。
http://localhost:8080/sandbox/employee-list.xhtml

・・・おおっ!!意図していた画面が表示されました!

ただ作りが悪いらしくINSERTボタンはエラーが出て動きません。残念ですが、今は置いておきます。

次は

persistence.xmlを修正することでGlassfishサーバ上で動作させることが出来ました。
トランザクションタイプをRESOURCE_LOCALからJTAに変えたわけですが、組み込みGlassfishでも同じなのかもしれません。
というわけで次回はこのpersistence.xmlglassfish-embedded上で動作させることに挑戦します。
データソースをどうやって登録するかが肝なのでしょう。