【问题标题】:update a record in primefaces datatable更新 primefaces 数据表中的记录
【发布时间】:2012-08-08 09:25:23
【问题描述】:

我正在使用 jsf hibernate spring primefaces 的集成。 我想更新一条记录。但我的代码不起作用。插入和删除效果很好。我没有错误。请帮我写正确的代码。 personeldao.java

public class PersonelDao implements IPersonelDao {
private SessionFactory sessionFactory;


public SessionFactory getSessionFactory() {
    return sessionFactory;
}

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
public void updatePersonel(Personel personel) {

    getSessionFactory().getCurrentSession().update(personel);
    }
public void deletePersonel(Personel personel) {
    getSessionFactory().getCurrentSession().delete(personel);

}

PersonelService.java

@Transactional(readOnly=true)
public class PersonelService implements IPersonelService{
    IPersonelDao personeldao;
    public IPersonelDao getPersoneldao() {
        return personeldao;
    }

    public void setPersoneldao(IPersonelDao personeldao) {
        this.personeldao = personeldao;
    }

    @Transactional(readOnly=true)
    public void updatePersonel(Personel personel){
    getPersoneldao().updatePersonel(personel);
}
    @Transactional(readOnly=false)

    public void deletePersonel(Personel personel) {
        getPersoneldao().deletePersonel(personel);

    }

PersonelBean.java

@ManagedBean(name="personelMB")
@RequestScoped
public class PersonelBean implements Serializable{
    private static final long serialVersionUID = 1L;

    @ManagedProperty(value="#{PersonelService}")
    IPersonelService personelservice;
    List<Personel> personelList;

    private int personel_id;
    private String pname;
    private String pfamily;
    private String paddress;
    private String pphone;
//getter and setter
public void deletePersonel(int personel_id){
        Personel personel=(Personel)personelservice.getPersonelId(personel_id);
        getPersonelservice().deletePersonel(personel);


    }

    public void updatePersonel(RowEditEvent event){
    Personel personel = (Personel)event.getObject();
    getPersonelservice().updatePersonel(personel);
        //getDataFromDatabase();
    }

}

personel.xhtml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="rtl" 
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:fn="http://java.sun.com/jsp/jstl/functions"
>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>اطلاعات پرسنلی</title>
</h:head>
<h:body>
<h1>اضافه کردن پرسنل جدید</h1>
        <h:form>

            <h:panelGrid columns="4" >
              شماره پرسنلی : 
                <h:inputText id="id" value="#{personelMB.personel_id}" 
                    size="20" required="true"
                    label="id" >
                </h:inputText>
                <br></br>
                نام : 
                <h:inputText id="name" value="#{personelMB.pname}" 
                    size="20" required="true"
                    label="Name" >
                </h:inputText>

                 نام خانوادگی: 
                <h:inputText id="family" value="#{personelMB.pfamily}" 
                    size="20" required="true"
                    label="family" >
                </h:inputText> 

                آدرس : 
                <h:inputTextarea id="address" value="#{personelMB.paddress}" 
                    cols="30" rows="10" required="true"
                    label="Address" >
                </h:inputTextarea>


          تلفن:  
                <h:inputText id="tel" value="#{personelMB.pphone}" 
                    size="20" required="true"
                    label="tel" >
                </h:inputText> 
            </h:panelGrid>

            <h:commandButton value="درج اطلاعات" action="#{personelMB.addPersonel()}" />

        </h:form>
 <h2>مشاهده اطلاعات پرسنل</h2>  
 <h:form  prependId="false">  

    <p:dataTable id="pdataTable" var="personel" value="#{personelMB.personelList}" rowKey="#{personelMB.personel_id}" editable="true"
    >  
  <p:ajax event="rowEdit" update="@form" listener="#{personelMB.updatePersonel}"/>
        <f:facet name="header">  
            اطلاعات پرسنل 
        </f:facet>  

        <p:column> 

            <f:facet name="header">  
               شماره پرسنلی  
            </f:facet>  

            <h:outputText value="#{personel.personel_id}" />  

            <f:facet name="footer">  
                کدملی 
            </f:facet>  
        </p:column>  

        <p:column headerText="نام">
        <p:cellEditor>
        <f:facet name="output">  
            <h:outputText value="#{personel.pname}" />
            </f:facet>
            <f:facet name="input">
              <p:inputText value="#{personel.pname}" />
              </f:facet>
            </p:cellEditor> 
        </p:column>  

        <p:column headerText="نام خانوادگی"> 
         <p:cellEditor> 
         <f:facet name="output">
            <h:outputText value="#{personel.pfamily}" /> 
            </f:facet>
            <f:facet name="input">
            <p:inputText value="#{personel.pfamily}" />
            </f:facet> 
            </p:cellEditor>  
        </p:column>  

        <p:column headerText="آدرس"> 
         <p:cellEditor> 
         <f:facet name="output">
            <h:outputText value="#{personel.paddress}" />  
            </f:facet>
            <f:facet name="input">
            <p:inputText value="#{personel.paddress}" />
            </f:facet>
            </p:cellEditor> 
        </p:column>  
   <p:column headerText="تلفن"> 
   <p:cellEditor> 
   <f:facet name="output">
            <h:outputText value="#{personel.pphone}" />
            </f:facet> 
            <f:facet name="input">
            <p:inputText value="#{personel.pphone}" /> 
            </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column headerText="حذف">
      <f:facet name="حذف">
         <h:outputText value="" />
      </f:facet>
      <p:commandButton icon="ui-icon-trash" title="حذف"
                       actionListener="#{personelMB.deletePersonel(personel.personel_id)}"  update="@form" ajax="true"/>
   </p:column>
   <p:column headerText="ويرايش">

         <p:rowEditor /> 



   </p:column>
        <f:facet name="footer">  
            تعداد رکورد#{fn:length(personelMB.getPersonelList())} میباشد.  
        </f:facet>  

    </p:dataTable>  

</h:form>  

</h:body>
</html>

personel.java

@Entity
@Table(name="TBLPERSONEL")
public class Personel {
@Id
@Column(name="PERSONEL_ID")
private int personel_id;
@Column(name="PNAME")
private String pname;
@Column(name="PFAMILY")
private String pfamily;
@Column(name="PADDRESS")
private String paddress;
@Column(name="PPHONE")
private String pphone;
@OneToOne
@PrimaryKeyJoinColumn
private Manager manager;
@OneToMany(mappedBy="personel")
private Set<Stufftransfer> stufftransfers;
public Personel(){

}
public Set<Stufftransfer> getStufftransfers() {
    return stufftransfers;
}
public void setStufftransfers(Set<Stufftransfer> stufftransfers) {
    this.stufftransfers = stufftransfers;
}
public Personel(int personel_id, String pname, String pfamily, String paddress,
        String pphone) {
    super();
    this.personel_id = personel_id;
    this.pname = pname;
    this.pfamily = pfamily;
    this.paddress = paddress;
    this.pphone = pphone;
}
//getter and setter

【问题讨论】:

  • 可以添加 Personel 类的代码吗?
  • 当您说更新不起作用时,实际发生了什么?有没有抛出异常?
  • @JamesB,我也不例外。我的代码不起作用。当我点击 primefaces 的行编辑器并更新记录时,它不起作用并且没有更新。
  • 您是否直接检查数据库以确认您正在更新的人员行的状态?
  • @JamesB,该行不会在数据库中更新。我认为我的更新代码不正确。我不知道。

标签: java hibernate jsf jakarta-ee primefaces


【解决方案1】:

像这样更改 ManagedBean 的 updatePersonel() 方法

    public void updatePersonel(int personel_id,String pname,String pfamily,String paddress,String pphone){
    Personel personel = new Personel();
    personel=(Personel)personelservice.getPersonelId(personel_id);
    if(personal != null) {
       personel.setPaddress(getPaddress());
       personel.setPersonel_id(getPersonel_id());
       personel.setPfamily(getPfamily());
       personel.setPname(getPname());
       personel.setPphone(getPphone());
       getPersonelservice().updatePersonel(personel_id, pname, pfamily, paddress, pphone);
    }
}

【讨论】:

    【解决方案2】:
    1. 使用p:commandButton 而不是h:commandButton
    2. p:commandButton中设置更新属性

    记住,在更新属性中找到正确的 id 可能有点棘手


    对不起,我误解了这个问题 正确答案是: 将您的更新方法更改为:

    public void updatePersonel(RowEditEvent event){
    Personel updated = (Pesonel)event.getObject();
    //this is the updated value from the dataTable, get the entity from db and do the update
    

    }

    还有一点:不要更新 ajax 事件上的行,因为你没有更新 update 方法中的personelList。这意味着rowEdit ajax 事件必须是这样的:

    <p:ajax event="rowEdit" listener="#{personelMB.updatePersonel}"/>
    

    【讨论】:

    • 侯赛因,你能帮帮我吗?这些天我正在努力更新。我是javaee的新手。我试试这个,但没有奏效。 public void updatePersonel(RowEditEvent event){ Personel personel=(Personel)event.getObject(); getPersonelservice().updatePersonel(personel); //getDataFromDatabase(); }
    • 嗨,萨米,运气好吗?新答案有帮助吗?
    • 嗨,侯赛因,我照你说的做了。但没有用。我已经更新了我的帖子。请检查一下好吗?它也不起作用。
    • 和hibernate映射有关系吗?
    • 不设置rowEdit事件的更新。更新行后,您没有更新整个列表对象,因此更新属性会导致问题。并检查数据库是否已更新。
    猜你喜欢
    • 2023-03-21
    • 2017-08-17
    • 2015-03-04
    • 2014-10-08
    • 2013-09-15
    • 1970-01-01
    • 2021-08-01
    • 2015-07-19
    • 2016-09-15
    相关资源
    最近更新 更多