我想编辑 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/