Primefaces: Updating after action(-Listener) completed

513 Views Asked by At

I want my p:datatable to update/refresh after I deleted an entry. Deletion on DB side succeeds. After a manual refresh, the entry is gone. But I can not get the p:datatable to refresh itself automatically

I aldready tried ajax commands, checking execution order and different update targets.

p:datatable from index.xhtml:

<h:form id="form">
        <p:dataTable id="table" var="row" value="#{mitarbeiterView.mitarbeiter}">
            <p:column headerText="ID">
                <h:outputText value="#{row.employeeId}" />
            </p:column>
            <p:column headerText="Name">
                <h:outputText value="#{row.lastname}" />
            </p:column>

            <p:column headerText="Löschen">
                <p:commandLink update=":form, :form:table" action="#{mitarbeiterService.deleteEmployee(mitarbeiterView.selectedEmployee)}" 
                        title="Löschen" styleClass="ui-icon pi pi-trash">
                    <f:setPropertyActionListener value="#{row}" target="#{mitarbeiterView.selectedEmployee}" />
                </p:commandLink>
            </p:column>
        </p:dataTable>
    </p:panelGrid>
</h:form>

MitarbeiterView.java:

@Named(value = "mitarbeiterView")
@ViewScoped
public class MitarbeiterView implements Serializable {

    private static final long serialVersionUID = 7924178697538784022L;

    private List<Employee> mitarbeiter;
    private Employee selectedEmployee;

    @PostConstruct
    public void init() {
        SessionConfig.initSession();
        mitarbeiter = Queries.findAllEmployees();
    }

    public List<Employee> getMitarbeiter() {
        return mitarbeiter;
    }

    public void setMitarbeiter(List<Employee> mitarbeiter) {
        this.mitarbeiter = mitarbeiter;
    }

    public void setSelectedEmployee(Employee selectedEmployee) {
        this.selectedEmployee = selectedEmployee;
    }

    public Employee getSelectedEmployee() {
        return selectedEmployee;
    }
}

MitarbeiterService.java```

@Named(value = "mitarbeiterService")
@ViewScoped
public class MitarbeiterService implements Serializable {

    private static final long serialVersionUID = -445070832052637147L;

    public void deleteEmployee(Employee mitarbeiter) {
        if (mitarbeiter != null) {
            ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
        }
    }

The p:datatable should refresh itself. The deleted employee should be gone.

2

There are 2 best solutions below

5
On BEST ANSWER

I think that you must just delete the selectedEmployee from your List<Employee> (mitarbeiter) .
You can do the query again in the backend after delete or just remove the selectedEmployee from your list. You must do this in method deleteEmployee

I think that deleteEmployee must be in the MitarbeiterView ManageBean. If you put the deleteEmployee in the MitarbeiterView ManageBean you can do somethink like this:

public void deleteEmployee(Employee mitarbeiter) {
    if (mitarbeiter != null) {
        ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
        mitarbeiter = Queries.findAllEmployees();
    }
}
0
On

Ok, new Answer. The comment-editor just looks rubish.

Thanks, this worked. The delete methode now looks like this:

    public void deleteEmployee(Employee mitarbeiter, MitarbeiterView view) {
        if (mitarbeiter != null) {
            ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());

            view.setMitarbeiter(Queries.findAllEmployees());
        }
    }

and the p:column

            <p:column headerText="Löschen">
                <p:commandLink update=":form, :form:table" action="#{mitarbeiterService.deleteEmployee(row, mitarbeiterView)}" 
                        title="Löschen" styleClass="ui-icon pi pi-trash"/>
            </p:column>

Forgot that I do not work on the live entities. Happens when a Life-long BACKend Developer has to design the FRONTend ;)

Update: The code would look nicer if I add an init method, binding the MitarbeiterView to a static variable. Passing to the method is just dirty and ugly.