/ / PickList traci wartość - primefaces, picklist

PickList traci wartość - prymityw, lista wyboru

Mam prosty, trwały obiekt (Hibernacja, jeśli robi coś innego):

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

}

Kod PrimeFaces wygląda jak (odpowiedni fragment):

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

To, co robi managedBeanA.handleTransfer, to po prostu utrzymywanie przekazanego obiektu.

Wszystko wydaje się działać pięknie, mogę rozwinąć wiersz i wywołać getDualList. Gdy rozwijam kolejny wiersz, wywoływana jest kolejna getDualList - wszystko zgodnie z oczekiwaniami.

Kiedy przenoszę elementy ze źródła do celu, wywoływany jest managedBeanA.handleTransfer, a odpowiedni obiekt zostaje utrwalony w bazie danych.

JEDNAK, a oto pytanie, kiedy stółjest aktualizowany - albo formularz wysyłania, albo ajax, widzę, że setDualList jest wywoływany dla KAŻDEGO elementu w p: dataTable z EMPTY getSource, które w istocie rozbijają wszystkie wcześniej utrwalone łącza (tj. this.children = null). Wcześniej połączone obiekty ObjectA nadal znajdują się w bazie danych, ale nie są już połączone ...

Jakieś pomysły, co się dzieje?

Odpowiedzi:

0 dla odpowiedzi № 1

Znalazłem rozwiązanie tego problemu. Prawdopodobnie jest to tylko obejście problemu, ponieważ nie jestem pewien, czym właściwie jest problem - w metodzie setDualList dodałem następujący wiersz:

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

co rozwiązuje wszystkie moje problemy (symptomem tego jest to, że seter jest wywoływany bez wartości).