コントローラー/バッキング 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 に変更情報を効率的に配布するにはどうすればよいでしょうか?