Как эффективно обновить свойство, содержащееся в нескольких классах?

У меня есть этот простой шаблон, где контроллер / компонент поддержки управляет одним экземпляром объекта в @ViewScoped контекст. Представление берет пару таких бобов и отображает информацию. Подход, который я использую, был описан Энди Гибсоном в этом посте.

Теперь мне нужно отобразить информацию о двух сущностях, Персоне и ее Контактах:

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

Я уже посмотрел на три решения:

  • непосредственно установив контакт на ContactMgr, но мне действительно нужно инициализировать еще несколько полей, прежде чем отобразится всплывающее окно, так как я не хочу нести такую ​​стоимость за каждый контакт.
  • Полная перезагрузка сайта возможна, но также довольно затратна.
  • С @Observe Боюсь, мне нужна дюжина методов, по одному на каждый список, к которому я прикрепляю Person

Итак, как я могу эффективно распространять информацию об изменениях от одного компонента к другим, которые содержат (теперь устаревшие) копии отредактированного объекта?

1 ответ

Решение

Я пришел к выводу, что проблема, по сути, похожа на аннулирование кэша - известную трудную проблему. Я мог бы приготовить что-нибудь, чтобы расширить @Observe(notifyOberserver = IF_EXISTS) Идея и заставить его работать без утопления в новых методах.

Но я обнаружил, что просто перенести задачу поддержки dataTable в ContactMgr и наличие всей логики заполнения, выбора и обновления списка, находящегося в одном классе, творило чудеса, чтобы вообще избежать этой проблемы.

Другие вопросы по тегам