2015-07-28 107 views
0

我正在研究一個簡單的應用程序,其中數據庫中的用戶記錄顯示在primefaces數據表中,用戶可以編輯或刪除記錄。 這裏是JSF文件更新/刪除查詢中的javax.persistence.TransactionRequiredException

<h:form> 
      <p:dataTable var="user" value="#{userBean.users}" > 
       <p:column headerText="username"> 
        <h:inputText value="#{user.username}" rendered="#{userBean.editable}" /> 
        <h:outputText value="#{user.username}" rendered="#{not userBean.editable}" /> 
        <!--<h:outputText value="#{user.username}" />--> 
       </p:column> 

       <p:column headerText="edit"> 
        <h:commandLink value="Edit" action="#{userBean.editAction(index)}" rendered="#{not userBean.editable}" /> 
       </p:column> 

       <p:column headerText="save"> 
        <p:commandButton value="Save" id="save" disabled="false" action="#{userBean.saveAction(user)}"/> 
       </p:column> 

       <p:column headerText="delete"> 
        <p:commandButton value="Delete" id="delete" disabled="false" action="#{userBean.deleteAction(user)}"/> 
       </p:column> 

      </p:dataTable> 

     </h:form> 

,這裏是保存和更新操作方法,我在豆

public String saveAction(User user) { 

    this.setEditable(false); 
    DB db = new DB(); 
    db.updateUser(user); 
    return "editSuccess"; 
} 

public String deleteAction(User user) { 

    DB db = new DB(); 
    db.deleteUser(user); 
    return "editSuccess"; 
} 

調用,這裏是在DAO層的方法

EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("RegisterationFormJPAPU"); 
EntityManager em = emf.createEntityManager(); 
public void updateUser(User user) { 
    Query query = em.createQuery("update User set username = :uname where username = :uname"); 
    query.setParameter("uname", user.getUsername()); 
    query.executeUpdate(); 
} 

public void deleteUser(User user) { 
    Query query = em.createQuery("delete from User where username = :uname"); 
    query.setParameter("uname", user.getUsername()); 
    query.executeUpdate(); 
} 

但是當我按編輯鏈接或刪除按鈕,出現此錯誤

Severe: javax.faces.el.EvaluationException: javax.persistence.TransactionRequiredException: 
Exception Description: No transaction is currently active 

有人會告訴我問題在哪裏。

+0

第一本我會做的是em.getTransaction()isActive(),看看是否真的不存在活躍交易。請檢查並更新 – giannisapi

+0

我在updateUser(用戶用戶)方法的開頭寫了這行代碼, 「System.out.println(」active「+ em.getTransaction()。isActive());」,並打印控制檯中的「主動錯誤」。 –

+0

好吧,這意味着交易不活躍,所以現在我們可以專注於此,我告訴你這樣做只是爲了確保。 – giannisapi

回答

3

高興試試這個:

em.getTransaction().begin(); 
    Query query = em.createQuery("update User set username = :uname where username = :uname"); 
    query.setParameter("uname", user.getUsername()); 
    query.executeUpdate(); 
    em.getTransaction().commit(); 

,讓我知道,如果這能解決你的問題。

+0

它解決了deleteUser方法,它從數據庫中刪除了用戶,但是在updateUser方法中,用戶沒有在數據庫中更新,知道我在更新查詢中得到了此警告「輸入參數只能用於where子句或具有查詢的子句「。 –

+0

這很奇怪,但是你可以嘗試使整個查詢成爲一個字符串,而不使用setParameter?整個字符串是這樣的: 「update User set username ='」+ user.getUsername()+「'其中username ='」+ user.getUsername()+「'」; 也嘗試createNativeQuery而不是createQuery – giannisapi

+0

似乎你沒有做任何事情查詢ü設置用戶名等於用戶名如果​​我沒有弄錯:) – giannisapi

0

您無法在此上下文中顯式調用事務。提交由服務器自動管理。

您可以簡單地使用:

user.setName("NEW USER NAME"); 
modifyUser(user); 

public void modifyUser(User user) { 
    em.merge(user)} 
相關問題