2012-08-22 111 views
0

我正在使用spring 3hibernate 4​​和primefaces的集成。 在我的數據表我可以insertdelete記錄,但我的更新代碼不起作用,無法更新表和數據庫。我不想使用primefaces cell editor,我想要command button執行更新。但是當我點擊命令按鈕時,它將刪除數據庫和數據表中除personel_id字段外的單元格(字段)。請幫助我獲得正確的代碼。 enter image description here 當我編輯的字段,然後點擊更新按鈕: enter image description here personelDao.java使用Hibernate,Primefaces和Spring更新記錄

public class PersonelDao implements IPersonelDao { 
    private SessionFactory sessionFactory; 
    public void addPersonel(Personel personel) { 
     getSessionFactory().getCurrentSession().save(personel); 
    } 
    public Personel updatePersonel(Personel personel) { 

final Session session = getSessionFactory().getCurrentSession(); 
if(session.contains(personel)){ 
    session.update(personel); 
} else { 
    personel = (Personel) session.merge(personel); 
} 
return personel; 
} 
public void deletePersonel(Personel personel) { 
      getSessionFactory().getCurrentSession().delete(personel); 
     } 
    } 

personelservice.java

@Transactional(readOnly=true) 
public class PersonelService implements IPersonelService{ 
    IPersonelDao personeldao; 
    @Transactional(readOnly=false) 
    public void addPersonel(Personel personel) { 
     getPersoneldao().addPersonel(personel); 
    } 

    @Transactional(readOnly=false) 
    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 addPersonel(){ 
      Personel personel=new Personel(); 
      personel.setPaddress(getPaddress()); 
      personel.setPersonel_id(getPersonel_id()); 
      personel.setPfamily(getPfamily()); 
      personel.setPname(getPname()); 
      personel.setPphone(getPphone()); 
      getPersonelservice().addPersonel(personel); 
      reset(); 
    } 

    public void deletePersonel(int personel_id){ 
      Personel personel=(Personel)personelservice.getPersonelId(personel_id); 
      getPersonelservice().deletePersonel(personel); 
    } 

    public void update(int personel_id){ 
     Personel personel=(Personel)personelservice.getPersonelId(personel_id); 
     personel.setPaddress(getPaddress()); 
     personel.setPfamily(getPfamily()); 
     personel.setPname(getPname()); 
     personel.setPphone(getPphone()); 
     getPersonelservice().updatePersonel(personel); 
    } 
} 

personel.xhtml

<h2>مشاهده اطلاعات پرسنل</h2> 
    <h:form prependId="false"> 
     <p:dataTable id="pdataTable" var="personel" value="#{personelMB.personelList}" rowKey="#{personelMB.personel_id}" editable="true" 
     > 
      <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:inputText value="#{personel.pname}" size="5"/> 
       </p:column> 
     <p:column headerText="نام خانوادگی"> 
      <p:inputText value="#{personel.pfamily}" size="5"/> 
       </p:column> 
     <p:column headerText="آدرس"> 
      <p:inputText value="#{personel.paddress}" size="5"/> 
      </p:column> 
     <p:column headerText="تلفن"> 
       <p:inputText value="#{personel.pphone}" size="5"/> 
      </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:commandButton icon="ui-icon-pencil" title="ويرایش" 
          actionListener="#{personelMB.update(personel.personel_id)}" update="@form" ajax="true"/> 
</p:column> 
     <f:facet name="footer"> 
      تعداد رکورد#{fn:length(personelMB.getPersonelList())} میباشد. 
     </f:facet> 

    </p:dataTable> 

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(){ 

    } 
    //getter and setter 
} 

跡:

Hibernate: update TBLPERSONEL set PADDRESS=?, PFAMILY=?, PNAME=?, PPHONE=? where PERSONEL_ID=? 
Hibernate: select personel0_.PERSONEL_ID as PERSONEL1_1_, personel0_.PADDRESS as PADDRESS1_, personel0_.PFAMILY as PFAMILY1_, personel0_.PNAME as PNAME1_, personel0_.PPHONE as PPHONE1_ from TBLPERSONEL personel0_ 
Hibernate: select manager0_.ID as ID0_1_, manager0_.PASSWORD as PASSWORD0_1_, manager0_.PERSONEL_ID as PERSONEL3_0_1_, personel1_.PERSONEL_ID as PERSONEL1_1_0_, personel1_.PADDRESS as PADDRESS1_0_, personel1_.PFAMILY as PFAMILY1_0_, personel1_.PNAME as PNAME1_0_, personel1_.PPHONE as PPHONE1_0_ from TBLMANAGER manager0_ left outer join TBLPERSONEL personel1_ on manager0_.ID=personel1_.PERSONEL_ID where manager0_.ID=? 
Hibernate: select manager0_.ID as ID0_1_, manager0_.PASSWORD as PASSWORD0_1_, manager0_.PERSONEL_ID as PERSONEL3_0_1_, personel1_.PERSONEL_ID as PERSONEL1_1_0_, personel1_.PADDRESS as PADDRESS1_0_, personel1_.PFAMILY as PFAMILY1_0_, personel1_.PNAME as PNAME1_0_, personel1_.PPHONE as PPHONE1_0_ from TBLMANAGER manager0_ left outer join TBLPERSONEL personel1_ on manager0_.ID=personel1_.PERSONEL_ID where manager0_.ID=? 
Hibernate: select manager0_.ID as ID0_1_, manager0_.PASSWORD as PASSWORD0_1_, manager0_.PERSONEL_ID as PERSONEL3_0_1_, personel1_.PERSONEL_ID as PERSONEL1_1_0_, personel1_.PADDRESS as PADDRESS1_0_, personel1_.PFAMILY as PFAMILY1_0_, personel1_.PNAME as PNAME1_0_, personel1_.PPHONE as PPHONE1_0_ from TBLMANAGER manager0_ left outer join TBLPERSONEL personel1_ on manager0_.ID=personel1_.PERSONEL_ID where manager0_.ID=? 
Hibernate: select personel0_.PERSONEL_ID as PERSONEL1_1_, personel0_.PADDRESS as PADDRESS1_, personel0_.PFAMILY as PFAMILY1_, personel0_.PNAME as PNAME1_, personel0_.PPHONE as PPHONE1_ from TBLPERSONEL personel0_ 
Hibernate: select manager0_.ID as ID0_1_, manager0_.PASSWORD as PASSWORD0_1_, manager0_.PERSONEL_ID as PERSONEL3_0_1_, personel1_.PERSONEL_ID as PERSONEL1_1_0_, personel1_.PADDRESS as PADDRESS1_0_, personel1_.PFAMILY as PFAMILY1_0_, personel1_.PNAME as PNAME1_0_, personel1_.PPHONE as PPHONE1_0_ from TBLMANAGER manager0_ left outer join TBLPERSONEL personel1_ on manager0_.ID=personel1_.PERSONEL_ID where manager0_.ID=? 
Hibernate: select manager0_.ID as ID0_1_, manager0_.PASSWORD as PASSWORD0_1_, manager0_.PERSONEL_ID as PERSONEL3_0_1_, personel1_.PERSONEL_ID as PERSONEL1_1_0_, personel1_.PADDRESS as PADDRESS1_0_, personel1_.PFAMILY as PFAMILY1_0_, personel1_.PNAME as PNAME1_0_, personel1_.PPHONE as PPHONE1_0_ from TBLMANAGER manager0_ left outer join TBLPERSONEL personel1_ on manager0_.ID=personel1_.PERSONEL_ID where manager0_.ID=? 
Hibernate: select manager0_.ID as ID0_1_, manager0_.PASSWORD as PASSWORD0_1_, manager0_.PERSONEL_ID as PERSONEL3_0_1_, personel1_.PERSONEL_ID as PERSONEL1_1_0_, personel1_.PADDRESS as PADDRESS1_0_, personel1_.PFAMILY as PFAMILY1_0_, personel1_.PNAME as PNAME1_0_, personel1_.PPHONE as PPHONE1_0_ from TBLMANAGER manager0_ left outer join TBLPERSONEL personel1_ on manager0_.ID=personel1_.PERSONEL_ID where manager0_.ID=? 

回答

0

僅在方法定義事務性和分配傳播,如果定義「TR ansactional「在課堂上適用於所有方法。

更改爲personelservice.java:

//@Transactional(readOnly=true) 
public class PersonelService implements IPersonelService{ 
    IPersonelDao personeldao; 
    @Transactional(propagation=Propagation.REQUIRED) 
    public void addPersonel(Personel personel) { 
     getPersoneldao().addPersonel(personel); 
    } 

    @Transactional(propagation=Propagation.REQUIRED) 
    public void updatePersonel(Personel personel){ 
     getPersoneldao().updatePersonel(personel); 
    } 

    @Transactional(propagation=Propagation.REQUIRED) 
    public void deletePersonel(Personel personel) { 
     getPersoneldao().deletePersonel(personel); 
    } 
} 

Regart,

馬努 - 納瓦羅。

PS:請原諒,我的英語小流體

+0

親愛的馬努,謝謝你的回覆。我做了你說的,但我的問題沒有解決。 – samira

0

你設置什麼樣的方式了,在「applicationContext.xml中」對數據庫的訪問?

+0

是的,我可以插入和刪除。但我無法更新。我認爲我的代碼不正確。 – samira

+0

在這種情況下,問題是更新實體的負擔和不在「@ Transactional」相同的定義中。 如果更新尚未加載到相同「@ Transactional」的實體可能未處於會話中,則對於此情況,有兩種選擇: 將@ Transactional置於初始方法「PersonelBean.update()」中。 在更新之前進行合併,收集返回的對象並在更新後執行。 問候, –

+0

你能告訴我Dao,Service和Personelbean的正確代碼嗎?非常感謝 – samira

0

防止會話丟失的問題時更新,變化,道:

public class PersonelDao implements IPersonelDao { 
    ... 
    public Personel updatePersonel(Personel personel) { 
     final Session session = getSessionFactory().getCurrentSession(); 
     if(session.contains(personel)){ 
      session.update(personel); 
     } else { 
      personel = (Personel) session.merge(personel); 
     } 
     return personel; 
    } 
    ... 
} 

因此如果實體不在會議將被迫將其與合併鏈接。

您還必須檢索合並所返回的對象,您可能必須強制並更改內存中的引用。

Regards,

+0

親愛的馬努,謝謝你的關注。但它也不起作用。我真的很困惑。當我編輯數據表單元格並單擊更新命令按鈕時,數據從數據庫和數據錶行中消失。 – samira

+0

馬努,我已編輯帖子添加跟蹤。請你看看。特別感謝 – samira

+0

以調試模式啓動它,希望傳遞正確的行,如果它給出錯誤,附加的錯誤和它發生的行。 –

相關問題