2009年10月7日水曜日

generate-entitiesにより作られたクラス2

続いて、C:\Projects\myproject\src\hot\com\mydomain\myproject\action\MyprojectList.java
これは所謂セッションBeanに相当するものです。MyprojectはエンティティBeanだったので、これに対するビジネスロジックを定義する場所と考えてください。
相当するものと書いたのは、EntityQueryを継承してしまうことで、一般的なセッションBeanの書き方とは異なるから。
セッションBeanを使う場合は、EntityManagerに関する記述を書いたり、セッションBeanであることを宣言したりすることが必要。

package com.mydomain.myproject.action;
import com.mydomain.myproject.model.*;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityQuery;
import java.util.Arrays;
@Name("myprojectList")
public class MyprojectList extends EntityQuery<Myproject> {
private static final String EJBQL = "select myproject from Myproject myproject";
private static final String[] RESTRICTIONS = {"lower(myproject.val) like lower(concat(#{myprojectList.myproject.val},'%'))",};
private Myproject myproject = new Myproject();
public MyprojectList() {
setEjbql(EJBQL);
setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
setMaxResults(25);
}
public Myproject getMyproject() {
return myproject;
}
}
ここでもアノテーションが出てくるので、簡単に。
@Name: これはSeamアノテーションで、Seamコンポート名というのを指定します。とか書くと分からないのですが、ここで宣言した名前でJSFから直接呼び出せることになっています。要はその時のクラスのインスタンス名を書いてって事なので、普通はクラス名の先頭を小文字にしたのを書いとけば十分です。

あれ?SQL変じゃね?って思った人がいるかもしれませんが、これはEJB3.0規格のEJB-QLという独自のSQL文になっています。何でそんなことを・・・と思うかもしれませんが、EJB-QLが間に挟まっているおかげで開発者はその先にあるデータベースの方言について一切意識する必要が無いのです。それは本来開発者の仕事ではなく、フレームワークの仕事だろってのがEJB3.0の思想になるわけです。

#{myprojectList.myproject.val}はJSF側の該当パラメータが直接入ります。どこにあるかというと、C:\Projects\myproject\view\MyprojectList.xhtml つまり、部分一致検索の条件パラメータが入ります。
普段、何層にも層を作って開発をされている方には気持ち悪いですが、本来これくらいシンプルじゃないと。

setMaxResults(25);

は検索結果の最大件数が25行までですよ、と宣言しています。こんなこともSQLだけでやろうと思うと、あれ?このDBの場合はどうやるんだっけ?って絶対迷うので、EJB-QLの場合そういうのが無いだけで精神衛生上良いです。(EJB-QLでどう書くんだっけ?とはなるわけだけど・・・・それは仕方ない。苦笑)

C:\Projects\myproject\src\hot\com\mydomain\myproject\action\MyprojectHome.java も同様にEntityQueryを継承していますが、こちらは今見てもさっぱり意味が分からないと思うので、スルーしましょう。(ぉぃ)

追いたい人は、C:\Projects\myproject\view\MyprojectEdit.xhtml からMyprojectHomeがどのように使われているのかを見ておくと良いです。ものすごくすっきりしてますが、正直何やってるか分かんないというのが実情ではないかと。

たった一行のDDL(create table)からgenerate-entitiesで出力されたCRUDするためのコードがどのように動いているのか、もう少し上手に説明したいところですが、余り使われてないEntityQueryのせいでちょっと分かりにくくなってしまっているんです。一通り全体が分かるようになったところでもう一度おさらいしてみて下さい。

0 件のコメント:

コメントを投稿