[jjbug-seam 12] 対話コンテキストの考え方について

22 views
Skip to first unread message

Naohiro Kuroda

unread,
May 22, 2007, 5:36:42 AM5/22/07
to japan-j...@lists.sourceforge.jp
お世話になっております。
seam の日本語 ML を作って頂いてありがとうございます。
早速投稿させて頂きました。

現在、jboss-seam-1.1.5.GA と JBoss AS 4.0.5 を使って開発を行っております。

★ <h:commandButton> と <s:button> の挙動差異について

クリック可能なリストを @dataModel と @dataModelSelection を使って実装し
ています。画面遷移は リスト画面 -> 項目修正画面(submit押下) -> リスト画
面と言う単純なものです。

===
@DataModel
private List<User> userList;

@DataModelSelection("userList")
@In(required=false) @Out(required=false)
private User user;
===

クリック可能リストからリンクする時は、<h:commandLink を使って JSF アクショ
ンリスナメソッド (今回は @Begin select()) を invoke します。

一方、編集画面の submit は @End modify() を invoke します。

この時、リスト画面では s:link を使うと、対話情報を伝播できず、NPE が発生
します。
<s:link id="links" value="#{usr.loginName}-2" action="#{userAction.select}"/>
下記を使うと対話情報を伝播できます。
<h:commandLink id="link" value="#{usr.loginName}" action="#{userAction.select}"/>

ドキュメント上では、対話情報の伝播の簡便化の為に s:link 等を用意している
と書いている気がするのですが、どの様に理解したらよいでしょうか?

★永続化のタイミングについて

また、編集画面で
<s:button action="#{userAction.userEdit}" value="submit2"/>
を使うと、user の値が変更されず永続化もされません。

編集画面の submit ボタンで実行する userEdit() ですが、
EntityManager の merge() 等は実行していないのに、データベースに永続化さ
れるようです。

どのタイミングで、永続化されると考えればよいでしょうか?
問題になってくるのは、アクションリスナの中でバリデーションを組んだ場合で、
例えば下記のような場合です。

@End
public String userEdit() {
log.info("<<<<< userEdit() <<<<<");

// 永続化はここで止めたい
if (! validUserName(user.getUserName())) {
// エラーメッセージ表示
log.info(">>>>> userEdit() >>>>>");
return null;
} else {

log.info(user.toString());
//em.merge(user); // <= コメントアウトしても永続化される
log.info(">>>>> userEdit() >>>>>");
return "/user";
}
}

画面遷移は止める事ができますが、この時点で永続化されてしまっているので、
ロールバックする事ができません。

以上、2点についてご教示いただけたら幸いです。
よろしくお願い致します。

_______________________________________________
Japan-jbug-seam mailing list
Japan-j...@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/japan-jbug-seam

Tetsyuki Fujiwara

unread,
May 23, 2007, 12:09:48 AM5/23/07
to japan-j...@lists.sourceforge.jp
藤原と申します。

★永続化のタイミングについて

EntityManagerの取り込み方で、DBへの書込みタイミングが異なるようです。

普通の永続化コンテキスト
@PersistenceContext
    EntityManager em;
メソッド呼び出し完了後に、エンティティは非管理になるようです。
アプリケーション側で、marge操作が必要になります。

拡張永続化コンテキスト
@PersistenceContext(type = PersistenceContextType.EXTENDED)
    EntityManager em;
異なるメソッド呼び出しでも、エンティティはずっと管理状態のまま。
DB更新のタイミングは、コンテナにお任せ。

で、拡張永続化コンテキストの場合に、@FlushModeアノテーションを
使うと、コミットするタイミングを手動で制御できるはずです。


07/05/22 に Naohiro Kuroda < kuroda-...@scs-solutions.co.jp> さんは書きました:
お世話になっております。
seam の日本語 ML を作って頂いてありがとうございます。
早速投稿させて頂きました。

★永続化のタイミングについて


Reply all
Reply to author
Forward
0 new messages