Jsf 使用primefaces中的行编辑事件获取重复行

Jsf 使用primefaces中的行编辑事件获取重复行,jsf,primefaces,Jsf,Primefaces,我使用的是Prime faces 3.5.8,我在行编辑事件中得到了重复的行。我得到的行数很好,但一条记录显示了两次,而不是另一条。这是我在调用clintList加载时得到的。当我关闭对话框并打开它时,它很好,即使我检查了我的列表,它也得到了正确的数据,提前感谢。。 我的编辑代码 public void onClientEdit(RowEditEvent event) { try { Client edtClient = (Client) even

我使用的是Prime faces 3.5.8,我在行编辑事件中得到了重复的行。我得到的行数很好,但一条记录显示了两次,而不是另一条。这是我在调用clintList加载时得到的。当我关闭对话框并打开它时,它很好,即使我检查了我的列表,它也得到了正确的数据,提前感谢。。 我的编辑代码

    public void onClientEdit(RowEditEvent event) {
        try {
            Client edtClient = (Client) event.getObject();
            if (null == edtClient.getClientName()
                    || edtClient.getClientName() == "") {
                FacesContext.getCurrentInstance().addMessage(
                        null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                CommonStringUtil.getUIString("clintNameEmpty"),
                                CommonStringUtil.getUIString("clintNameEmpty")));
                getAgencyClients();
                return;
            }
            HibernateUtil.beginTransaction();
            Agency tempAgency = agencyHome.findById(agency.getAgencyId());
            Hibernate.initialize(tempAgency.getClients());  
            HibernateUtil.commitTransaction();
            for (Client cl : (Set<Client>) tempAgency.getClients()) {
                if (cl.getClientName().equalsIgnoreCase(
                        edtClient.getClientName().trim())) {
                    log.debug("Client Name Already exists");
                    FacesContext.getCurrentInstance().addMessage(
                            null,
                            new FacesMessage(FacesMessage.SEVERITY_WARN,

                                    CommonStringUtil
                                            .getUIString("clientNameExists"),

                                    CommonStringUtil
                                            .getUIString("clientNameExists")));                 
                    getAgencyClients();
                    return;
                }
            }
            HibernateUtil.beginTransaction();
            Client eClient = clientHome.findById(edtClient.getClientId());
            eClient.setClientName(edtClient.getClientName());
            clientHome.attachDirty(eClient);
            clientName = null;
            agencyHome.attachDirty(agency);
            HibernateUtil.commitTransaction();
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO, CommonStringUtil
                            .getUIString("clientNameEditSucc"), CommonStringUtil
                            .getUIString("clientNameEditSucc")));
            } catch (Exception e) {
            if (HibernateUtil.isTransactionActive())
                HibernateUtil.rollbackTransaction();
            log.error("Error Updating Client Name", e);
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, CommonStringUtil
                            .getUIString("clientNameEditFail"), CommonStringUtil
                            .getUIString("clientNameEditFail")));
        }
    } 

My View Part

<p:dialog widgetVar="clientDialogue" modal="true" id="clientdilogId"
        showHeader="false" style="padding:0;">
        <h:form id="clientDlgForm">
            <p:toolbar style="height:38px;">
                <p:toolbarGroup align="left">
                    <h:outputText
                        value="Edit Client Messages: #{adminAgencyBean.agencyName}"
                        styleClass="dialog-header-Text" style="line-height:38px"></h:outputText>
                </p:toolbarGroup>
                <p:toolbarGroup align="right" style="margin-left:50px;">
                    <p:inputText value="#{adminAgencyBean.clientName}" id="clientName"
                        maxlength="45" />
                    <p:spacer width="5"></p:spacer>
                    <p:commandButton action="#{adminAgencyBean.createClient}"
                        icon="ui-icon-custom-arrow" iconPos="right" value="Create"
                        style="margin-left:5px;margin-right:20px;" update="@form" />
                    <p:commandLink value="X" onclick="clientDialogue.hide()"
                        style="text-decoration:none;margin-right:10px;" process="@none"></p:commandLink>
                </p:toolbarGroup>
            </p:toolbar>

            <p:messages id="clientMsgs" />
            <p:scrollPanel style="width:980px;height:400px;width:100%;"
                mode="native">

                <p:dataTable value="#{adminAgencyBean.clientList}" var="client"
                    sortBy="#{client.clientName}" sortOrder="ascending" editable="true"
                    id="ClientTable">

                    <p:ajax event="rowEdit" listener="#{adminAgencyBean.onClientEdit}"
                        update=":clientDlgForm:clientMsgs"/>
                    <p:ajax event="rowEditCancel" />
                    <p:column headerText="Client Name" sortBy="#{client.clientName}"
                        style="white-space:pre-line;width:130px;">
                        <p:cellEditor>
                            <f:facet name="output">
                                <h:outputText value="#{client.clientName}" />
                            </f:facet>
                            <f:facet name="input">
                                <p:inputText id="editClientName" value="#{client.clientName}"
                                    maxlength="45"  style="width:90px"></p:inputText>

                            </f:facet>
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Edit Client"
                        style="white-space:pre-line;width:80px;">
                        <p:rowEditor
                            rendered="#{adminAgencyBean.clientTransactionMap[client.clientId] lt 1}" />
                        <h:outputText value="#{commonmessages.NoEdit}"
                            rendered="#{adminAgencyBean.clientTransactionMap[client.clientId] ge 1}" />

                    </p:column>
                    <p:column headerText="Remove Client"
                        style="width:85px;white-space:pre-line">
                        <p:commandButton value="Remove"
                            rendered="#{adminAgencyBean.clientTransactionMap[client.clientId] lt 1}"
                            action="#{adminAgencyBean.deleteClient}" update="@form"
                            process="@none" styleClass="blue_button">
                            <f:setPropertyActionListener target="#{adminAgencyBean.clientId}"
                                value="#{client.clientId}"></f:setPropertyActionListener>
                        </p:commandButton>
                        <h:outputText value="#{commonmessages.nodelete}"
                            rendered="#{adminAgencyBean.clientTransactionMap[client.clientId] ge 1}" />
                    </p:column>

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

每次编辑单元格时都会将其保存到数据库中。这是巨大的开销,你最好让PF完成所有的工作,然后有一个保存按钮等来调用你的hibernate提交功能。完成此操作后,还需要重新加载UI,以确保它具有已重新加载到变量中的最新代码。Thanks@VeenarM,我无法理解你的观点,在我的要求中,我需要保存编辑过的单元格显示新列表,这就是我每次保存的原因。从UI层抽象数据库层,基本上,您的datatable/单元格编辑将从PF组件自动进行,即当您进行更改时,它会编辑datatable变量上的值-确保通过在行编辑上显示/旧值/新值的类似咆哮的消息来实现这一点。然后添加一个执行数据库“提交”的按钮——基本上,您需要确保已保存的内容被重新加载。但是,如果没有完整的文件,就很难看到。thanks@VeenarM我知道它会自动更新DATABATE,如果我给NulLin在St蜇中,那么我需要重新加载列表,它是失败的,第二个是如果我给现有的名字,那么我们需要重新加载列表,所以请考虑这些条件…我也看到了同样的问题。我确信这是一个bug,涉及行编辑和排序之间的交互。这是我发现的关于行编辑与其他功能(如动态列等)交互的第二个问题。因此,我开始避开行编辑器。建议在较低的一层进行排序是一个很好的建议。