エンティティ・マネージャをなんとかする

<< 戻る   トップ >>

エンティティ・マネージャの問題を見ておこう。netbeans 備え付けのサンプルデータベースでは問題が起きないことから、ユーザ認証まわりを疑っている。まず、persistence.xml を覗いてみると、persistence unit が JNDI を使って jdbc/nanban というデータソースに指定されている。この段階でユーザ認証情報はない。次に glassfish-resources.xml を見ると、ここに jdbc/nanban の詳細情報があり、ユーザ認証まわりもしっかりと記載されている。問題はなさそうだ。

本件でとにかく不思議なのが、エンティティクラスの生成はなんのエラーもなくできるのに、Persistece Unit の生成がうまくいかないというところだ。エンティティクラスの生成はアプリケーションであるところの netbeans が行っていることだから、サーバ glassfish の動作とは関係がないということか。さらに、お仕着せのサンプルデータベース sample は異常なく動作するのだ。

鴨乃嘴南蛮のように外部キーがあって件数も多い (といっても 1,000 レコードだから DBMS 的には大したことないはずだ) データではなく、シンプルなデータではどうかを試したり、ユーザ名やパスワードが悪いのではないかと疑ってみたりもしたのだが、どうやってもうまくいかない。それで最後の手段、動作するものと同じ状態にしようと考えた。

jdbc/sample と同じ設定にしてみようというわけだ。jdbc/sample を使う場合は、glassfish-resources.xml を使わない。すなわち、glassfish サーバのどこかで JNDI jdbc/sample が定義され、ユーザ認証情報や derby とのコネクタや uri が設定されているはずなのだ。Netbeans のサービスウィンドウから GlassFish Server を右クリックすると、プルダウンメニューからサーバコンソール (Web) にアクセスできる。JDBCリソースとJDBC接続プールの設定ができるので、jdbc/sample を参考に jdbc/nanban を設定する。これで問題なく動作するようになる。

本来、Tomcat でサーバ全体の設定をする server.xml をいじる代わりにコンテナ固有の設定はの context.xml で記述するように、JDBCリソース/接続プールの設定は glassfish-resources.xml でできるべきだ。なにか設定に見落としがあるのか、はたまた一時的なバグなのか、改善の余地はありそうだがとりあえずこのまま進めていくことにしよう。

...

そのまま進むのも何だったので改めて調べてみた。インターネット上でとにかくうるさく言われているのが「glassfish-resources.xml はちゃんと WEB-INF にあるか?」ということだった。そんなものは自動的に配置されているだろう、と思ったのが甘かった。プロジェクト/setup というフォルダに入っていたのだ。したがって、自力で WEB-INF 下にコピーしなくてはいけない。

もうひとつ指摘されていたのが JNDI 名の付け方だ。jdbc/nanban という「名前」だけではなくパスを通して "java:app/jdbc/naban" を使用する。この2点に注意すれば、サーバ本体の設定をいじらずともちゃんと動作するのであった。めでたし、めでたし。


作成: 2014-05-27 09:37:54.0更新: 2014-05-27 21:24:50.0
http://museo-anonimo.jp/nanban/?id=1274,http://museo-anonimo.jp/nanban/tr/1274