Как эффективно обновить свойство, содержащееся в нескольких классах?
У меня есть этот простой шаблон, где контроллер / компонент поддержки управляет одним экземпляром объекта в @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
и наличие всей логики заполнения, выбора и обновления списка, находящегося в одном классе, творило чудеса, чтобы вообще избежать этой проблемы.