価値を失う:ピックリストは、私は(それがどんな違う場合は、休止状態)を、単純な永続オブジェクトを持っている
PrimeFacesのコードが(関連するスニペット)のように見えます@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();
...
}
}
:
...
<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オブジェクトはまだデータベースにありますが、リンクされていません...
何が起こっているのですか?