Jsf 2 如何有效地更新包含在多个类中的属性?

Jsf 2 如何有效地更新包含在多个类中的属性?,jsf-2,cdi,weld2,Jsf 2,Cdi,Weld2,我有一个简单的模式,其中控制器/支持bean在@ViewScoped上下文中管理单个实体实例。该视图获取两个支持bean并显示信息。Andy Gibson在本文中描述了我使用的方法 现在我需要显示两个实体的信息,一个人及其联系人: @Entity public class Person { @Id @Generated private Long id; @OneToMany(mappedBy = "owner") private Set<Contact

我有一个简单的模式,其中控制器/支持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;
}
单击链接将加载所选联系人,并允许用户根据自己的喜好进行编辑。然后,用户单击“保存”,更改将被持久化。到现在为止,一切都很好

但是现在我想重新呈现联系人列表。如何使
PersonMgr
了解更改的联系人?联系人列表是在一段时间前填充的,在
ContactMgr
中没有更改

我已经研究了三种解决方案:

  • 直接在
    ContactMgr
    上设置联系人,但在弹出窗口显示之前,我确实需要初始化更多的字段,因为我不想让每个联系人都承担这样的费用
  • 一个完整的站点重新加载是可能的,但也相当昂贵
  • 对于
    @Observe
    我恐怕需要一打方法,我附加到
    人员的每个列表都需要一个方法

那么,我如何才能有效地将更改信息从一个bean分发给包含(现在已过时)已编辑实体副本的其他bean呢?

我开始认为这个问题实际上就像缓存失效一样——这是一个已知的难题。我可能会编一些东西来扩展
@Observe(notifyOberserver=IF_存在)
的想法,并使其在不被新方法淹没的情况下工作

但我发现,简单地将支持
dataTable
的任务移动到
ContactMgr
,并将填充、选择和更新列表的所有逻辑都放在一个类中,就可以奇迹般地避免这个问题

<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>