0

コントローラー/バッキング Bean がコンテキスト内の単一のエンティティ インスタンスを管理するこの単純なパターンがあり@ViewScopedます。ビューはこれらのバッキング Bean を 2 つ取り、情報を表示します。私が使用しているアプローチは、このブログ投稿で Andy Gibson によって説明されています。

次に、Person と Contacts の 2 つのエンティティに関する情報を表示する必要があります。

@Entity
public class Person {
    @Id @Generated 
    private Long id;

    @OneToMany(mappedBy = "owner") 
    private Set<Contact> contacts = new LinkedHashSet<>();
}

@Entity
public class Contact {
    @Id @Generated 
    private Long id;

    private String content;

    @ManyToOne
    private Person owner;

    @OneToMany
    private Set<File> attachments;
}

ContactMgr と PersonMgr があり、最初に .via を完全にロードしPersonますf:viewAction。次に、その人の連絡先のリストを表示し、ユーザーが次のように編集できるようにしますrich:popupPanel

<h:dataTable value="#{personMgr.instance.contacts}" var="c">
    <h:column><a4j:commandLink value="#{c.content}"
        actionListener="#{contactMgr.setId(c.id)}"
        action="#{contactMgr.fullInit()}"
        render=":contactInnards"
        oncomplete="#{rich:component('contactPanel')}.show();" />
    </h:column>
 </h:dataTable>

リンクをクリックすると、選択した連絡先が読み込まれ、ユーザーは好きなように編集できます。ユーザーが「保存」をクリックすると、変更が保持されます。ここまでは、すべて問題ありません。

しかし、連絡先リストを再レンダリングしたいと思います。PersonMgr連絡先の変更はどのように通知すればよいですか? 連絡先のリストは、しばらく前に入力されたもので、 では変更されていませんContactMgr

私はすでに3つのソリューションを見てきました:

  • 連絡先を直接設定しますが、連絡先ContactMgrごとにそのコストを負担したくないため、ポップアップが表示される前にさらにいくつかのフィールドを初期化する必要があります。
  • サイトを完全にリロードすることも可能ですが、かなりの費用がかかります。
  • 残念@Observeながら、アタッチするリストごとに 1 つずつ、12 のメソッドが必要です。Person

では、ある Bean から、編集されたエンティティーの (現在は古くなった) コピーを含む他の Bean に変更情報を効率的に配布するにはどうすればよいでしょうか?

4

1 に答える 1

0

この問題は事実上、既知の困難な問題であるキャッシュの無効化に似ていると考えるようになりました。@Observe(notifyOberserver = IF_EXISTS)新しい方法に溺れることなく、アイデアを拡張して機能させるために何かを調理することができるでしょう。

しかし、単純に をバックアップするタスクを移動し、リストの入力、選択、および更新のすべてのロジックを単一のクラスに配置するだけで、問題を完全に回避するのに驚くほど効果があることがわかりましdataTableContactMgr

于 2013-11-04T11:17:28.537 に答える