0

我有一个简单的模式,控制器/支持 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?

4

1 回答 1

0

我开始认为这个问题实际上就像缓存失效 - 一个已知的难题。我可能会做一些事情来扩展这个@Observe(notifyOberserver = IF_EXISTS)想法,让它在不被新方法淹没的情况下发挥作用。

我发现,只需将支持dataTableto的任务移动到一个类中,ContactMgr并将所有填充、选择和更新列表的逻辑都放在一个类中,就可以完全避免这个问题。

于 2013-11-04T11:17:28.537 回答