Как отобразить запись в таблице данных после сохранения в базе данных?

В SQL Server у меня есть схема (ада) с некоторыми таблицами, два из которых:

picture of table Demandas and table Anotacoes

Я использую Eclipselink ORM и Primefaces 6.2; У меня есть CRUD для обеих таблиц, и он отлично работает.

В ListDemandas.jsf у меня есть таблица данных, в которую пользователь может вставить новый реестр Demandas, нажав кнопку. Затем диалоговое окно (расположенное в CreateDemandas.jsf) отображается для ввода данных в некоторые поля. После нажатия кнопки сохранения такой диалог скрывается, а таблица данных обновляется, показывая эту новую запись Demandas; то же действие происходит с сущностью Anotacoes, используя ListAnotacoes.jsf и CreateAnotacoes.jsf.

Что я хочу предназначен для вставки реестров Anotacoes через страницу ListDemandas.jsf, и сразу после сохранения этого нового реестра Anotacoes он будет отображаться в таблице данных Demandas (которая находится на странице ListDemandas.jsf).

Что мне удалось сделать до сих пор: я помещаю кнопку в ListDemandas.jsf, чтобы вызвать диалог (расположенный в CreateAnotacoes.jsf). После нажатия кнопки сохранения в таком диалоговом окне этот диалог (Anotacoes) скрывается, и данные правильно сохраняются в базе данных.

Проблема в том, что эта новая запись Anotacoes не отображается в таблице данных Demandas, даже при обновлении, как показано ниже:

<p:commandButton actionListener="#{anotacoesController.saveNew}" value="Save" update="display,:DemandasListForm:datalist,:DemandasListForm:DemandasDataTableContextMenu,:growl" oncomplete="handleSubmit(xhr,status,args,PF('AnotacaoCreateDialog'));" >

ListDemandas.jsf:

<h:form id="DemandasListForm">

    <p:panel id="PanelListForm" header="#{adeBundle.ListDemandasTitle}">

        <p:commandButton id="createButton"         value="Create Demanda"  update=":DemandasCreateForm" oncomplete="PF('DemandasCreateDialog').show()" actionListener="#{demandasController.prepareCreate}" />
        <p:commandButton id="createAnotacaoButton" value="Create Anotacao" update=":AnotacaoCreateForm, datalist" oncomplete="PF('AnotacaoCreateDialog').show()" />

        <p:dataTable id="datalist"
                     value="#{demandasController.items}"
                     lazy="false"
                     rowKey="#{item.id}"
                     var="item"
                     selection="#{demandasController.selected}"
                     widgetVar="demandasTable">

            <p:ajax event="rowSelect"   update="@form:createAnotacaoButton, @form:createButton" listener="#{demandasController.resetParents}"/>
            <p:ajax event="rowUnselect" update="@form:createAnotacaoButton, @form:createButton" listener="#{demandasController.resetParents}"/>
            <p:ajax event="contextMenu" update="@form:createAnotacaoButton, @form:createButton" listener="#{demandasController.resetParents}"/>

            <p:column id="idCod" >
                <f:facet name="header">
                    <h:outputText value="id"/>
                </f:facet>
                <h:outputText value="#{item.id}"/>
            </p:column>

            <!-- some columns ommited -->    

            <p:rowExpansion>
                <p:panelGrid>
                    <p:column>
                        <p:row>
                            <p:accordionPanel value="Mais informacoes da Demanda" multiple="true">
                                <p:tab title="Anotacoes}" >
                                    <p:dataList value="#{item.anotacoesCollection}" var="anotacoesCollectionItem" itemType="none" emptyMessage="-" >
                                        <h:outputText value="#{anotacoesCollectionItem.anotacao.toString()}" />
                                    </p:dataList>
                                </p:tab>
                            </p:accordionPanel>
                        </p:row>
                    </p:column>
                </p:panelGrid>
            </p:rowExpansion>
        </p:dataTable>
    </p:panel>
    <ui:include src="/WEB-INF/include/confirmation.xhtml"/>    
</h:form>

CreateAnotacao.jsf:

    <p:dialog id="AnotacaoCreateDlg" widgetVar="AnotacaoCreateDialog" modal="true" appendTo="@(body)" header="Create Anotacoes" >

    <h:form id="AnotacaoCreateForm" >

        <h:panelGroup id="display" >
            <p:panelGrid columns="2" columnClasses="column">

                <p:outputLabel value="CreateAnotacoesLabel_anotacao" for="anotacao" />
                <h:panelGroup>
                    <p:inputTextarea id="anotacao" value="#{anotacoesController.selected.anotacao}" title="CreateAnotacoesTitle_anotacao" />
                </h:panelGroup>

                <p:outputLabel value="CreateAnotacoesLabel_date" for="date" />
                <h:panelGroup>
                    <p:calendar id="date" value="#{demandasController.currentDate}" title="CreateAnotacoesTitle_date" />
                </h:panelGroup>

        <!-- some other input fields ommited -->                

            </p:panelGrid>
        </h:panelGroup>

        <p:commandButton actionListener="#{anotacoesController.saveNew}" value="Save" update="display, :DemandasListForm:datalist, :growl" oncomplete="handleSubmit(xhr,status,args,PF('AnotacaoCreateDialog'));" >
            <p:confirm header="Confirmation" message="Are you sure ?" />
        </p:commandButton>

        <p:commandButton value="Cancel" oncomplete="PF('AnotacaoCreateDialog').hide()" update="display" process="@this" immediate="true" resetValues="true"/>

    </h:form>
</p:dialog>

Выдержки из класса AbstractController.java:

public abstract class AbstractController<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    private Class<T> itemClass;
    private T selected;
    private Collection<T> items;
    private List<T> filteredItems;

    private enum PersistAction {

        CREATE,
        DELETE,
        UPDATE
    }

    public AbstractController() {
    }

    public AbstractController(Class<T> itemClass) {
        this.itemClass = itemClass;
    }

    public void setSelected(T selected) {
        if (selected != null) {
            if (this.selected == null || !this.selected.equals(selected)) {
                this.selected = this.ejbFacade.findWithParents(selected);
                this.setChildrenEmptyFlags();
            }
        } else {
            this.selected = null;
        }
    }

    protected void setEmbeddableKeys() {
    }

    protected void initializeEmbeddableKey() {
    }

    public Collection<T> getItems() {
        if (itemClass.getSimpleName().equals("Demandas")) {
            if (sessionPrefixo == 9600) {
                items = this.ejbFacade.findAll();
            } else {
                items = this.ejbFacade.findAllVenceHojeByNomeUorPos(uorPosDiageJurisdiciona);
            }
        }
        return items;
    }

    public void save(ActionEvent event) {
        String msg = ResourceBundle.getBundle("/adeBundle").getString(itemClass.getSimpleName() + "Updated");
        persist(PersistAction.UPDATE, msg);

        if (!isValidationFailed()) {
            // Update the existing entity inside the item list
            List<T> itemList = refreshItem(this.selected, this.items);

            // If the original list has changed (it is a new object)
            if (this.items != itemList) {
                this.setItems(itemList);
            }
            // Also refresh the filteredItems list in case the user has filtered the DataTable
            if (filteredItems != null) {
                refreshItem(this.selected, this.filteredItems);
            }
        }
    }

    public void saveNew(ActionEvent event) {
        String msg = ResourceBundle.getBundle("/adeBundle").getString(itemClass.getSimpleName() + "Created");
        persist(PersistAction.CREATE, msg);

        if (!isValidationFailed()) {
            items = null; // Invalidate list of items to trigger re-query.
            lazyItems = null; // Invalidate list of lazy items to trigger re-query.
        }
    }

    private void persist(PersistAction persistAction, String successMessage) {
        if (selected != null) {
            this.setEmbeddableKeys();
            try {
                if (persistAction != PersistAction.DELETE) {
                    this.ejbFacade.edit(selected);
                } else {
                    this.ejbFacade.remove(selected);
                }
                this.setChildrenEmptyFlags();
                JsfUtil.addSuccessMessage(successMessage);
            } catch (EJBException ex) {
                Throwable cause = JsfUtil.getRootCause(ex.getCause());
                if (cause != null) {
                    if (cause instanceof ConstraintViolationException) {
                        ConstraintViolationException excp = (ConstraintViolationException) cause;
                        for (ConstraintViolation s : excp.getConstraintViolations()) {
                            JsfUtil.addErrorMessage(s.getMessage());
                        }
                    } else {
                        String msg = cause.getLocalizedMessage();
                        if (msg.length() > 0) {
                            JsfUtil.addErrorMessage(msg);
                        } else {
                            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
                        }
                    }
                }
            } catch (Exception ex) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/adeBundle").getString("PersistenceErrorOccured"));
            }
        }
    }

    public T prepareCreate(ActionEvent event) {
        T newItem;
        try {
            newItem = itemClass.newInstance();
            this.selected = newItem;
            initializeEmbeddableKey();
            return newItem;
        } catch (InstantiationException | IllegalAccessException ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public boolean isValidationFailed() {
        return JsfUtil.isValidationFailed();
    }

    public String getComponentMessages(String clientComponent, String defaultMessage) {
        return JsfUtil.getComponentMessages(clientComponent, defaultMessage);
    }

    @PostConstruct
    public void initParams() {
        Object paramItems = FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(itemClass.getSimpleName() + "_items");
        if (paramItems != null) {
            setItems((Collection<T>) paramItems);
        }
    }

    private List<T> refreshItem(T item, Collection<T> items) {

        List<T> itemList;
        if (this.items instanceof List) {
            itemList = (List<T>) items;
        } else {
            itemList = new ArrayList<>(items);
        }
        int i = itemList.indexOf(item);
        if (i >= 0) {
            try {
                itemList.set(i, item);
            } catch (UnsupportedOperationException ex) {
                return refreshItem(item, new ArrayList<>(items));
            }
        }
        return itemList;
    }

    public AbstractFacade<T> getEjbFacade() {
        return ejbFacade;
    }

    public void setEjbFacade(AbstractFacade<T> ejbFacade) {
        this.ejbFacade = ejbFacade;
    }
}

Выдержка из класса AbstractFacade.java:

[...]
public void edit(T entity) {
    getEntityManager().merge(entity);
}
[...]

Как упоминалось в комментариях, это ссылка на таблицу Demandas:

image for Demandas datatable id reference

Пожалуйста, кто-нибудь может помочь мне решить эту проблему?

Откройте консоль браузера (F12). Какой у вас точный идентификатор datalist? Он должен соответствовать вашей ссылке здесь.

Xtreme Biker 14.09.2018 08:16

@Xtreme Biker, как мы видим на изображении, которое я разместил в вопросе, идентификатор ссылки (желтый обведен) в браузере такой же, как в коде CreateAnotacao.jsf: <p:commandButton actionListener="#{anotacoesController.saveNew}" value="Save" update="display, :DemandasListForm:datalist, :growl" [...]. Еще намек, пожалуйста?

jMarcel 27.09.2018 23:25
0
2
116
0

Другие вопросы по теме