/ / PickList Wert verlieren - Primefaces, Auswahlliste

PickList Wert verlieren - Primefaces, Auswahlliste

Ich habe ein einfaches persistentes Objekt (Hibernate, falls es anders ist):

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

}

Der PrimeFaces-Code sieht folgendermaßen aus (relevantes Snippet):

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

Bei managedBeanA.handleTransfer bleibt das übergebene Objekt einfach erhalten.

Alles scheint wunderbar zu funktionieren, ich kann die Zeile erweitern und getDualList heißt. Wenn ich eine weitere Zeile expandiere, wird eine andere getDualList aufgerufen - alles wie erwartet.

Wenn ich Elemente von der Quelle zum Ziel verschiebe, wird managedBeanA.handleTransfer aufgerufen, und das entsprechende Objekt bleibt in der Datenbank erhalten.

JEDOCH, und hier ist die Frage, wann der Tisch istist aktualisiert - entweder Form Submit oder Ajax. Ich kann sehen, dass setDualList für JEDES Element in der p: dataTable mit EMPTY getSource aufgerufen wird, die im Wesentlichen alle zuvor persistierten Links aufhebt (d. h. this.children = null). Die zuvor verknüpften ObjectA-Objekte befinden sich noch in der Datenbank, sind aber nicht mehr miteinander verbunden.

Irgendwelche Ideen, was los ist?

Antworten:

0 für die Antwort № 1

Ich habe eine Lösung für das Problem gefunden. Es ist wahrscheinlich nur eine Problemumgehung, da ich nicht sicher bin, was das Problem tatsächlich ist. In der Methode setDualList habe ich folgende Zeile hinzugefügt:

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

das löst alle meine Probleme (als Symptom der Probleme ist, dass der Setter ohne Werte aufgerufen wird).