Hallo,
ich habe folgendes Problem mit dem Updaten von zwei dataTable (Primefaces, aber das sollte egal sein):
-die zweite Tabelle baut auf der ersten auf: die erste zeigt alle Personen, die zweite die zugehörigen Payments für eine selektierte Person.
Außerdem (und das ist der Knackpunkt) soll die erste Tabelle für jede Person die Anzahl der Payments anzeigen. Sofort, wenn eines hinzugefügt wurde.
-ich lasse beide Tables über ein ajax autoUpdate aktualisieren
-habe 2 @RequestScoped Services, welche jeweils in einer @PostConstruct Methode die list-variable für die Tables setzen. Dafür wird innerhalb der PostConstruct Methode ein database query gemacht.
Ich füge nun bei der unteren Tabelle ein Payment ein (mit commandButton und action). Das Payment erscheint sofort in der unteren Tabelle, in der oberen Person-Tabelle wird allerdings die Anzahl der Payments NICHT geupdatet.
Die Ursache konnte ich zumindest identifizieren: auf den buttonclick läuft zunächst der ServicePerson der ersten Tabelle los, und dann erst der ServicePayment mit der Action Methode der zweiten Tabelle! Das hat zur Folge, dass zunächst die erste Tabelle NICHT aktualisiert wird, sondern nur die zweite.
Erst beim nächsten Request wird dann die erste Tabelle auch aktualisiert.
Das liegt offenbar daran, dass wie beschrieben zunächst der Service für die erste Tabelle läuft (damit die alten Daten aus der DB holt), und dann erst die eigentliche Action Methode des Buttons (wodurch nun erst das neue Payment in der DB drin ist).
Jetzt ist die Frage: das kann doch nicht gewollt sein? Oder kann ich irgendwas übersehen haben?
Ich kann es nicht beides in einen Service packen, weil das sonst zu unübersichtlich wird.
Jetzt ist also die Frage: wie kann die die Reihenfolge der Services steuern? Und warum wird überhaupt der ServicePerson zuerst ausgeführt, wenn ich einen Button clicke, der eine Action für einen ganz anderen Service, nämlich ServicePayment, definiert?
Danke falls jemand soweit gelesen hat...
Pseudocode in etwa so:
JSF:
[XML]<outputPanel autoUpdate=true>
<dataTable value=servicePerson.list>
<column> #{var.list.size()}
<command button addPerson>
</outputPanel>
...
<outputPanel autoUpdate=true>
<dataTable value=servicePayment.list>
<commandButton addPayment>
</outputPanel>[/XML]
SERVICES:
------------
Also Workaround fiel mir grad noch ein:
Ich kann natürlich ServicePerson IN ServicePayment injezieren, und nach dem persistieren des Payments innerhalb einfach nochmal die findAll() Methode des ServicePerson aufrufen. Damit dann auch der aktuelle Stand der DB gefetcht wird:
Aber das kann nicht die Lösung sein, unschöner gehts wohl kaum...
ich habe folgendes Problem mit dem Updaten von zwei dataTable (Primefaces, aber das sollte egal sein):
-die zweite Tabelle baut auf der ersten auf: die erste zeigt alle Personen, die zweite die zugehörigen Payments für eine selektierte Person.
Außerdem (und das ist der Knackpunkt) soll die erste Tabelle für jede Person die Anzahl der Payments anzeigen. Sofort, wenn eines hinzugefügt wurde.
-ich lasse beide Tables über ein ajax autoUpdate aktualisieren
-habe 2 @RequestScoped Services, welche jeweils in einer @PostConstruct Methode die list-variable für die Tables setzen. Dafür wird innerhalb der PostConstruct Methode ein database query gemacht.
Ich füge nun bei der unteren Tabelle ein Payment ein (mit commandButton und action). Das Payment erscheint sofort in der unteren Tabelle, in der oberen Person-Tabelle wird allerdings die Anzahl der Payments NICHT geupdatet.
Die Ursache konnte ich zumindest identifizieren: auf den buttonclick läuft zunächst der ServicePerson der ersten Tabelle los, und dann erst der ServicePayment mit der Action Methode der zweiten Tabelle! Das hat zur Folge, dass zunächst die erste Tabelle NICHT aktualisiert wird, sondern nur die zweite.
Erst beim nächsten Request wird dann die erste Tabelle auch aktualisiert.
Das liegt offenbar daran, dass wie beschrieben zunächst der Service für die erste Tabelle läuft (damit die alten Daten aus der DB holt), und dann erst die eigentliche Action Methode des Buttons (wodurch nun erst das neue Payment in der DB drin ist).
Jetzt ist die Frage: das kann doch nicht gewollt sein? Oder kann ich irgendwas übersehen haben?
Ich kann es nicht beides in einen Service packen, weil das sonst zu unübersichtlich wird.
Jetzt ist also die Frage: wie kann die die Reihenfolge der Services steuern? Und warum wird überhaupt der ServicePerson zuerst ausgeführt, wenn ich einen Button clicke, der eine Action für einen ganz anderen Service, nämlich ServicePayment, definiert?
Danke falls jemand soweit gelesen hat...
Pseudocode in etwa so:
JSF:
[XML]<outputPanel autoUpdate=true>
<dataTable value=servicePerson.list>
<column> #{var.list.size()}
<command button addPerson>
</outputPanel>
...
<outputPanel autoUpdate=true>
<dataTable value=servicePayment.list>
<commandButton addPayment>
</outputPanel>[/XML]
SERVICES:
Java:
class ServicePerson {
private list;
@PostConstruct
findAll() {
list = NamedQuery("Person.ALL")
}
}
class ServicePayment {
private list;
@PostConstruct
findAll() {
list = NamedQuery("Payments.ALL_FROM_CUSTOMER")
/* wenn ich hier den database request wie in ServicePayment
* machen würde, dann bekomme ich hier die korrekte anzahl!
* dh ich muss es nur hinbekommen, dass ServicePerson NACH ServicePayment läuft.
*/
log(NamedQuery("Person.ALL").size())
}
addPayment() {
persist...
}
}
------------
Also Workaround fiel mir grad noch ein:
Ich kann natürlich ServicePerson IN ServicePayment injezieren, und nach dem persistieren des Payments innerhalb einfach nochmal die findAll() Methode des ServicePerson aufrufen. Damit dann auch der aktuelle Stand der DB gefetcht wird:
Java:
class ServicePayment {
@Inject
ServicePerson
addPayment() {
persist...
ServicePerson.findAll();
}
}
Aber das kann nicht die Lösung sein, unschöner gehts wohl kaum...
Zuletzt bearbeitet: