2007年12月20日木曜日

J2EE 1.4

J2EE 1.4 で iBATIS を使った Bean Managed Entity Bean のサンプルを作ることに
なった。一つ一つ手で行うのは無謀なので NetBeans6 を使ってみる。

J2EE 1.4 なので以下の URL を参考にする。
http://www.netbeans.org/kb/41/
http://www.netbeans.org/kb/41/j2ee-tut/index.html

SavingsAccount のサンプルで Bean Managed Bean を作ってみる。Bean Module を
作り、Entity Bean を追加する。Entity Bean 内で Enterprise Resource ->
Use Database でデータベースを選択することになるが、サンプルは NetBeans4.1
ベースで当時のバンドルデータベースは pointbase で細かなところが違って
くる。

Use Database のダイアログでまず最初に指定するのは Reference Name だが、
これは app server ごとに異なる sun-ejb-jar.xml の中で JNDI で参照する
サーバのデータベースリソース (jdbc/mysqlTest01 等) につける名前だ。
この設定は NetBeans が勝手にやってくれる。選択対象は Sun Java System
Application Server Admin Console の Resources/JDBC/JDBC Resources の
エントリから選択することになる。このページには jdbc/* がリストされている。
これらのエントリは個々に enable/disable ができて Resources/JDBC/Connection Pools
のエントリを参照している。Connection Pools のエントリはいわゆるデータ
ソースで URL, user, JDBC driver 等の属性を持っている。PointBase を
復習するのも面倒なので MySQL を使ってみる。ウィザードを使えば設定は
比較的簡単だが、最初 XA driver を選んでしまい、トランザクション関連の
エラーになったので、ただのデータソースにした。コネクションプールに
対応した JDBC Resource も定義して、Entity Bean からは適当に名前を
つけたリソースを参照させる。

実際の DB ソーサのコードはベタな JDBC なのでサンプルからコピー。
ビジネスメッソッドもコンテキストメニューを使ったり、リファクタリングの
フィールドのエンカプセレイト機能を使って作っていく。ビジネスメソッドは
対応するものが *Remote.java のインターフェイスに定義されていなければ
ならないが、IDE が 'throws RemoteException;' を自動的につけてくれて
いないメソッドについては実行時にエラーが出たので、手でつけた。

Home メソッドも追加していくことになるが、コンテキストメニューで追加すると
Bean には ejbFindByLastName のようなメソッドができるが、戻り値を複数に
指定しておくとどうやら Home インターフェイス側には cByLastName のような
メソッドができる。コレクションで返すのでこういうネーミングになっているのかも
と勝手に納得していたが、そういうことではないらしい。名前はあっていないと
いけない。インターフェイスにあわせて ejbCByLastName とやってもだめ、
ejbcByLastName とやってもだめだった。Collection を返すことが名前から
わかることは悪いことではないと思い、Home 側を findcByLastName として
Bean 側を ejbFindcByLastName とすると動いた。この辺は Java Beans の
細かなところを調べればわかるのかも知れないが、その気力はない。
経験則としてキャメルケース・パスカルケースに1文字のワードというか、節を
持たせるのは良くないということを覚えておこう。

これくらいをクリアしたところで動くようになった。サンプルのクライアントで
一箇所だけ動かなかったのは remove の呼び出し。そのままでは文法エラーに
なるし、home 経由で呼ぼうとしてもエラーが消えない。今回はスキップ。


次に Roster のサンプルで CMP も確認しておく。このケースではもともと
関連のあるテープルを定義しておいて、それから New -> CMP Entity Beans from
Database... で作っている。若干強引に MySQL 上にテーブルを作ってこの処理を
すると関連のテーブルだけプライマリキーがないということで Bean が
作成されない。alter table _table_name_ add constraint primary key (field, field1,...)
で強引にやると作成されたが、ejb-jar.xml に CMP Relationships がまったく
現れない。

結局 Derby でテーブル作成の SQL が通ったので、それをもとにやってみると
動いたみたい。1:N や M:N の参照をわかりやすい名前に ejb-jar.xml で変更する
とそれがソースに反映されるとあったが、どうやらこれは動いていない。

次のステップとしていくつかの Bean に finder メソッドを EJB QL で追加して
行くところだが、このあたりは NB 4.1 と 6.0 の違いが大きいようで、このあたりで
今日は断念。

やっぱり、昔の EJB は面倒くさい...

0 件のコメント: