2012-08-07 71 views
2

我想編輯primfaces數據表中的一行。我正在使用jsf hibernate spring primefaces的集成。但我有以下錯誤。在編輯primefaces數據表後將數據保存到集成hibernate spring jsf和primefaces的數據庫中

javax.el.ELException: /personel.xhtml @60,83 listener="#{personelMB.updatePersonel(personel.personel_id)}": org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

personelmanagedbean:

@ManagedBean(name="personelMB") 
@ViewScoped 
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 updatePersonel(int personel_id){ 
     Personel personel=(Personel)personelservice.getPersonelId(personel_id); 
     getPersonelservice().updatePersonel(personel); 
    } 

} 

personel.xhtml:

<h:form prependId="false"> 

    <p:dataTable id="pdataTable" var="personel" value="#{personelMB.personelList}" rowKey="#{personelMB.personel_id}" editable="true" 
    > 
    <p:ajax event="rowEdit" update="@this" listener="#{personelMB.updatePersonel(personel.personel_id)}"/> 
     <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"> 
       <h: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"> 
      <h: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"> 
      <h: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"> 
      <h:inputText value="#{personel.pphone}" /> 
      </f:facet> 
      </p:cellEditor> 
     </p:column> 

    <p:column headerText="ويرايش"> 

     <p:rowEditor /> 



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

    </p:dataTable> 

</h:form> 

personelservice:

@Transactional(readOnly=true) 
public class PersonelService implements IPersonelService{ 
    IPersonelDao personeldao; 
//getter and setter 
@Transactional(readOnly=false) 
    @Override 
    public void updatePersonel(Personel personel) { 
     getPersoneldao().updatePersonel(personel); 

    } 

personeldao:

public class PersonelDao implements IPersonelDao { 
private SessionFactory sessionFactory; 
//getter and setter 
@Override 
public void updatePersonel(Personel personel) { 
    getSessionFactory().getCurrentSession().update(personel); 

} 

請幫助我如何編輯我的數據表並將其保存在數據庫中。

回答

0

這是在一個事務中獲取Hibernate實體並嘗試在另一個事務中使用不同的Hibernate會話更新它的問題。

要正確執行此操作,您需要在同一個事務中提取並更新Personel對象。這意味着您需要有一個@Transactional業務邏輯方法,您可以通過ManagedBean調用兩個方法。

在IPersonelService實現類:

@Transactional 
public void updatePersonel(int personel_id, String pname, String pfamily ...){ 
    Personel personel = personelDao.getPersonel(personel_id); 
    personel.setPName(pname); 
    .... 
    getSessionFactory().getCurrentSession().saveOrUpdate(personel); 
} 

這將單獨的,從你的表現邏輯的業務邏輯,以及讓所有單交易背後的數據庫調用的。

+0

我已經完成了你所說的。但我仍然有這個錯誤。 – samira 2012-08-07 11:29:40