/ / PickList perde valor - primefaces, lista de opções

PickList perder valor - primefaces, lista de seleção

Eu tenho um objeto persistente simples (Hibernate, se faz diferente):

@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();
...
}

}

O código PrimeFaces se parece com (trecho relevante):

...
<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>

O que managedBeanA.handleTransfer faz é simplesmente persistir o objeto passado.

Tudo parece funcionar muito bem, eu posso expandir a linha e getDualList é chamado. Quando eu expandir outra linha, outro getDualList é chamado - tudo conforme o esperado.

Quando eu movo itens da origem para o destino, o managedBeanA.handleTransfer é chamado e o objeto relevante é persistido no banco de dados.

No entanto, e aqui está a questão, quando a mesaé atualizado - seja formulário submit ou ajax, posso ver que setDualList é chamado para EVERY item no p: dataTable com EMPTY getSource que, em essência, quebra todos os links anteriormente persistidos (por exemplo, this.children = null). Os objetos ObjectA anteriormente vinculados ainda estão no banco de dados, mas não estão mais vinculados ...

Alguma idéia do que está acontecendo?

Respostas:

0 para resposta № 1

Eu encontrei uma solução para o problema. É provavelmente apenas uma solução alternativa, pois não tenho certeza de qual é realmente o problema - no método setDualList, adicionei a seguinte linha:

if (l.getSource().isEmpty() && l.getTarget().isEmpty()) return;

que resolve todos os meus problemas (como o sintoma dos problemas é que o setter é chamado sem valores).