2013-11-01 1 views
0

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

Теперь мне нужно, чтобы отобразить информацию о двух субъектов, человек и его Контакты:

@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

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

ответ

0

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

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

Смежные вопросы