tablas tabla registro example editar editable data con jsf primefaces datatable getter roweditor

jsf - registro - primefaces tabla editable



Los valores editados/actualizados en p: dataTable rowEdit no están disponibles en el método de escucha, ya que se sobrescriben con los datos existentes de la base de datos. (1)

Estoy editando datos con el editor de filas <p:dataTable> como se muestra a continuación.

<p:dataTable value="#{bean.users}" var="user" editable="true"> <p:ajax event="rowEdit" listener="#{bean.onRowEdit}" /> <p:ajax event="rowEditCancel" listener="#{bean.onRowEditCancel}" /> <p:column> <p:cellEditor> <f:facet name="output"> <h:outputText value="#{user.firstName}" /> </f:facet> <f:facet name="input"> <p:inputText value="#{user.firstName}" /> </f:facet> </p:cellEditor> </p:column> </p:dataTable>

El bean de respaldo se implementa de la siguiente manera.

private List<User> users; @EJB private UserService userService; public List<User> getUsers() { users = userService.list(); return users; }

Cuando ingreso los datos nuevos en el editor de celda y los envío, no están disponibles en el método de escucha. Noté que los sobrescriben los datos llamados de la base de datos.

¿Por qué sucede esto y cómo puedo evitarlo?


Su problema se debe a la realización de la lógica de negocios en un método getter. Cada iteración sobre la tabla de datos invocará el método getter. Entonces, mientras JSF está ocupado iterando sobre la tabla de datos para establecer los valores enviados en el modelo, las llamadas captadoras devuelven una nueva lista de DB una y otra vez.

Se supone que no debes llevar a cabo la lógica comercial en un método getter. Mientras seas un principiante, será mejor que te abstengas de tocar los métodos getter (y setter) y realizar el trabajo en otro lugar en un método llamado una vez.

Es probable que necesite @PostConstruct (y un verdadero servicio / clase DAO) aquí:

private List<User> users; @EJB private UserService userService; @PostConstruct public void init() { users = userService.list(); // Call the DB here. } public List<User> getUsers() { return users; // Just return the already-prepared model. Do NOT do anything else here! }

Ver también: