我有一个简单的持久对象(休眠,如果它有任何不同):
@Entity
Class ObjectA
{
private Long id;
private String name;
private String description;
private List<ObjectA> children = new LinkedList<>();
...
...
...
public org.primefaces.model.DualListModel<ObjectA> getDualList() {
org.primefaces.model.DualListModel<ObjectA> l = new org.primefaces.model.DualListModel<>();
l.setSource(this.children);
l.setTarget(database.getAllChildren()); // performs database query to retrieve all objectA that are not corrently linked to any objectA.
...
return l;
}
public setDualList(org.primefaces.model.DualListModel<ObjectA> l) {
this.children = l.getSource();
...
}
}
PrimeFaces 代码看起来像(相关片段):
...
<p:dataTable id="table" value="#{managedBeanA.getAllObjects}" var="iterator" paginator="true" rows="10" >
...
...
<p:rowExpansion>
<p:pickList value="#{iterator.dualList}" var="l" itemLabel="#{l.name}" itemValue="#{requirement.id}">
<f:facet name="sourceCaption">Linked Children</f:facet>
<f:facet name="targetCaption">Unlinked Children</f:facet>
<p:ajax event="transfer" listener="#{managedBeanA.handleTransfer(iterator)}"/>
</p:pickList>
</p:rowExpansion>
</p:dataTable>
managedBeanA.handleTransfer 所做的只是持久化传递的对象。
一切似乎都很好,我可以扩展行并调用 getDualList。当我展开另一行时,会调用另一个 getDualList - 一切都符合预期。
当我将项目从源移动到目标时,会调用 managedBeanA.handleTransfer 并将相关对象保存在数据库中。
但是,这里的问题是,当表格被更新时 - 无论是表单提交还是 ajax,我可以看到 setDualList 被调用为 p:dataTable 中的每个项目,并使用 EMPTY getSource 本质上破坏了之前保留的所有链接(即this.children = null)。先前链接的 ObjectA 对象仍在数据库中,但它们不再链接...
有什么想法吗?