Jsf 使用primefaces中的行编辑事件获取重复行
我使用的是Prime faces 3.5.8,我在行编辑事件中得到了重复的行。我得到的行数很好,但一条记录显示了两次,而不是另一条。这是我在调用clintList加载时得到的。当我关闭对话框并打开它时,它很好,即使我检查了我的列表,它也得到了正确的数据,提前感谢。。 我的编辑代码Jsf 使用primefaces中的行编辑事件获取重复行,jsf,primefaces,Jsf,Primefaces,我使用的是Prime faces 3.5.8,我在行编辑事件中得到了重复的行。我得到的行数很好,但一条记录显示了两次,而不是另一条。这是我在调用clintList加载时得到的。当我关闭对话框并打开它时,它很好,即使我检查了我的列表,它也得到了正确的数据,提前感谢。。 我的编辑代码 public void onClientEdit(RowEditEvent event) { try { Client edtClient = (Client) even
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,涉及行编辑和排序之间的交互。这是我发现的关于行编辑与其他功能(如动态列等)交互的第二个问题。因此,我开始避开行编辑器。建议在较低的一层进行排序是一个很好的建议。