java - 在hibernate spring jsf和primefaces的集成中将primefaces数据表编辑到数据库后保存数据

标签 java hibernate jsf jakarta-ee primefaces

我想编辑 primfaces 数据表中的一行。我正在使用 jsf hibernate spring 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

个人托管bean:

@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);
    }

}

人员.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> 

人事服务:

@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);

    }

个人道:

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

}

请帮助我如何编辑我的数据表并将其保存在数据库中。

最佳答案

这是一个在一个事务中获取 Hibernate 实体并尝试在另一个具有不同 Hibernate session 的事务中更新它的问题。

要正确执行此操作,您需要在同一事务中获取并更新您的 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); 
} 

这会将您的业务逻辑与您的表示逻辑分开,并使您的所有数据库调用都在一个事务之后。

关于java - 在hibernate spring jsf和primefaces的集成中将primefaces数据表编辑到数据库后保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843441/

相关文章:

java - 如何将所有必需的 jar 放入最后一个 jar 中?

Java - 以分钟为单位计算差异

java - 了解 JPA 唯一约束的原因

java - 调用 dao.findByID(id) 后实体属性没有改变

java - PrimeFaces SelectOneMenu ajax 渲染

java - Primefaces SelectCheckboxMenu 空值

tomcat中的Java文件路径

java - Spring boot 没有使用 spring 数据和 hibernate 与 sql server 一起运行

java - 使用 @OneToMany 注释关系时是否可以定义 LEFT Join?

jsf - JSF 中验证失败的 javascript 回调