我有一个简单的模式,控制器/支持 bean 在@ViewScoped
上下文中管理单个实体实例。该视图采用几个支持 bean 并显示信息。Andy Gibson 在这篇博文中描述了我正在使用的方法。
现在我需要显示有关两个实体的信息,一个人及其联系人:
@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,我首先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
.
我已经看过三个解决方案:
- 直接将联系人设置为 on
ContactMgr
,但我确实需要在显示弹出窗口之前初始化更多字段,因为我不想为每个联系人承担费用。 - 一个完整的站点重新加载是可能的,但也相当昂贵。
@Observe
恐怕我需要十几种方法,我附加的每个列表都有一个Person
那么,如何有效地将更改信息从一个 bean 分发到包含已编辑实体的(现在陈旧的)副本的其他 bean?