TodoDao クラス用のコードの一覧を見ていきましょう。
@Stateful
@Name("todoDao")
public class TodoDao implements TodoDaoInt {
@In (required=false) @Out (required=false)
private Todo todo;
@PersistenceContext (type=EXTENDED)
private EntityManager em;
// Injected from pages.xml
Long id;
public String persist () {
em.persist (todo);
return "persisted";
}
@DataModel
private List <Todo> todos;
@Factory("todos")
public void findTodos () {
todos = em.createQuery("select t from Todo t")
.getResultList();
}
public void setId (Long id) {
this.id = id;
if (id != null) {
todo = (Todo) em.find(Todo.class, id);
} else {
todo = new Todo ();
}
}
public Long getId () {
return id;
}
public String delete () {
em.remove( todo );
return "removed";
}
public String update () {
return "updated";
}
@Remove @Destroy
public void destroy() {}
}
最初に、これがステートフルセッション bean だということを認識して下さい。Seam は ステートフルとステートレスの両方のセッション bean を使用できます。これらが EJB3 bean の最も一般的な二つのタイプです。
@In アノテーションと @Out アノテーションは Seam 内にインジェクションされる一つの属性を定義します。 その属性はこのオブジェクトにインジェクションされるか、 または todo という名の Seam コンテキスト変数(Todo.java 内に定義されている使用中の Todo クラスの Seam 登録名への参照)を経由してこのオブジェクトからもう一つのオブジェクトへインジェクションされます。
@PersistenceContext アノテーションは EJB3 Entity マネージャを呼び出し、 このオブジェクトがデータベースに対してオブジェクトを永続化するようにします。 これはステートフル(stateful)のセッション bean であり、 PersistenceContext タイプは EXTENDED にセットしてあるため、 同じ Entity マネージャインスタンスはセッション bean の Remove メソッドがコールされるまで使用されます。 使用されるデータベース(persistence-unit)はファイル resources/META-INF/persistence.xml で定義されています。
このセッション bean は、 Web からのリクエスト(todo オブジェクトの形式値)に関連のあるコンテキストと、 トランザクションリソース(EntityManager)内で維持されている状態へ同時アクセスを持っていることに注意して下さい。 これは伝統的な J2EE アーキテクチャとは相反しますが、 Seam はこの方法を強制することはありません。 ユーザーは、 必要であれば、 より慣習的なアプリケーションレイヤー形式を使用することができます。
@DataModel アノテーションは、 todos プロパティを初期化し、 これは view への押し出し、 抽出させます。 @Factory アノテーションのメソッドは todos リスト収集の作業を実行し、 表出した DataModel プロパティにアクセスしようとする場合には、 Seam からコールを受けて、 null 状態になりす。 todos プロパティにはプロパティのアクセスメソッドが存在しないことに注意して下さい。 Seam が自動的にこれを実行します。
todos のリストを表示と編集する為に使用する JSF コードを見て、これらの インターフェースの使用法に関する実践知識を得ましょう。