我有一个 PrimeFaces 数据表,每行都有编辑按钮,可打开 Primefaces 动态对话框,但为了克服对话框呈现时的 LazyLoad 异常,我使用
actionListener
重新查询数据库并完全填充 selectedItem
。
更新对话框中的记录后,数据表不会刷新。我知道我的
update=
是正确的,并且意识到问题是因为我正在更新的对象不是表中引用的实际对象,而是在actionListener中实例化的新的完全加载的对象。
我的解决方法是使用
indexOf
并在完全加载的列表中重新设置该值 selectedItem
这是正确的方法还是这是一种黑客行为?如果对象的 equals 编码不正确,可能会适得其反。
public void update() {
dataService.update(selectedItem);
listOfItems.set(listOfItems.indexOf(selectedItem), selectedItem); <-Typically done?
}
<h:form id="formId">
<p:dataTable id="dataTableId" value="#{dataManagerView.listOfItems}" var="item">
<p:column headerText="Action">
<p:commandButton oncomplete="PF('editDialogWv').show()" update=":outlookDialogId"
actionListener="#{dataManagerView.loadDataViewDetails(item)}" >
<ui:remove>Cannot do just this due to LazyLoad Exception
<f:setPropertyActionListener value="#{item}" target="#{dataManagerView.selectedItem}" />
</ui:remove>
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
public void loadDataViewDetails(Item item) {
// Called from actionListener
selectedItem = dataService.retrieveFullById(item.getId());
}
<p:dialog id="outlookDialogId" dynamic="true" widgetVar="outlookDialogWv" >
<h:form id="outlookFormId">
bunch of form input boxes
<p:commandButton update="formId:dataTableId" action="#{dataManagerView.update()}">
</p:commandButton>
</h:form>
</p:dialog>
public void update() {
dataService.update(selectedItem); //The selected item only refreshes in table if I manually refresh browser
}
这可行,但这是正确的方法吗?
public void update() {
dataService.update(selectedItem);
listOfItems.set(listOfItems.indexOf(selectedItem), selectedItem);
}
这可行,但这是正确的方法吗?
没关系。假设
equals()
方法仅检查技术相等性(例如生成的密钥)而不是自然相等性(整个对象,即所有属性)。否则,您对所选项目所做的更改可能会导致 equals()
返回 false
。更安全的是:
public void loadDataViewDetails(Item item) {
originalSelectedItem = item;
selectedItem = dataService.retrieveFullById(item.getId());
}
public void update() {
dataService.update(selectedItem);
listOfItems.set(listOfItems.indexOf(originalSelectedItem), selectedItem);
}
但通常您只需从服务重新加载整个列表,以确保所有其他项目也反映最新的更改,以防同时由其他人编辑。例如
public void update() {
dataService.update(selectedItem);
listOfItems = dataService.list();
}