2

こんにちは、webapp で jboss を使用しています。メッセージを投稿したり、投稿済みのメッセージに返信したりできるフォーラム ページに似たページを 1 つ取得しました。私のjsfには、新しいメッセージを追加するための3つのdivタグがあり、1つはすべてのメッセージを一覧表示するため、もう1つは選択したメッセージを表示するためです。すべてのタグが埋め込まれており、すべてのタグに次のような render 属性があります。

<h:pannelGroup rendered="#{myController.shouldRender('add')}">

<!-- Here is my html for adding new message -->

</h:pannelGroup>


<h:pannelGroup rendered="#{myController.shouldRender('list')}">

<!-- Here is my html for listing messages -->

</h:pannelGroup>

<h:pannelGroup rendered="#{myController.shouldRender('view')}">

<!--    Here is my html for viewing message and its replys.. 
    also there is hidden div with html for popup to post reply -->


<div id="reply">
<!--    This is hidden html that is shown when clicked reply 
        link in the message div below. 
        When shown users can add reply to the message -->
</div>

<div id="message">
<!-- Here is show the message itself -->
</div>

<div id="replyList">
<!-- Here is list replys for the message currently beeing viewed 

    For listing the replys i used ui:repeate and c:forEach from the jstl core
    both resulting with same outcome.

    In my message object i have list of replys which i load lazily...
-->
</div>

</h:pannelGroup>

すべての注釈と残りのコードを取り除いたバッキング Bean...

MyController{

String page;

public boolean shouldRender(String view){
    return page.equals(view);
}
}

メニュー項目のリストからactionListenerで設定したページプロパティは、ユーザーをmessage.xhtmlページにリダイレクトする前に、myControllerのプロパティページを表示したいdiv名に設定します。たとえば、追加リンクをクリックすると、 page = "add" して、message.xhtml にリダイレクトします。そこで、コントローラーは外部からページ セットを取得し、add div をレンダリングします。

拡張永続コンテキストを機能させることができなかったため、/* にフィルターを設定してユーザー トランザクションを開き、chain.DoFilter の後でトランザクションをコミットした後、エンティティ マネージャーをそのトランザクションとマージしました。これは、手動で遅延読み込みを有効にする必要がありました..

問題は、返信メッセージを追加すると、返信のあるリストがすぐに更新されないことです。メッセージ リストに戻ってから、ビュー div で同じメッセージをもう一度開いて、返信のリストを更新する必要があります..または...返信を追加する方法で、メッセージオブジェクトが所有する返信のリスト内に返信を手動でロードしようとしました(遅延ロードされ、@OneToManyにマップされています)。

トランザクションを管理し、リストをロードすると、リストが自動的に更新されないと想定しているため、休止状態が遅延ロードされたリストをリロードしていることを誰かに教えてもらえますか。

4

1 に答える 1

0

リストが同じセッションで変更されると、リストが更新されます。

リストが別のセッションで変更された場合、リストは更新されません。

セッション オブジェクトはマルチスレッド セーフではないため、お使いの環境ではおそらくすべてのユーザーが独自のセッション インスタンスを持っているため、2 番目のケースになります。強制的に更新するには、親インスタンスを evict() して再度 load() するか、セッションを clear() するか、新しいセッションを作成して使用します。

遅延読み込みに注意してください。子要素は最初の使用時に (親インスタンスと一緒ではなく) 読み込まれるため、親オブジェクトが読み込まれたときにまだ行われていない変更を反映することができます。

于 2012-11-27T10:31:37.827 に答える