2015-07-28 5 views
0

Я работаю над простым приложением, в котором записи пользователей в базе данных отображаются в виде шрифтов, которые могут быть изменены, и пользователь может редактировать или удалять записи. Вот JSF файлjavax.persistence.TransactionRequiredException в запросе update/delete

<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"; 
} 

и здесь методы в дао слое

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 (User user), «System.out.println (« active »+ em.getTransaction(). isActive());», и он печатается «активная ложь» в консоли. –

+0

ok это означает, что транзакция неактивна, поэтому теперь мы можем сосредоточиться на этом, я сказал вам сделать это, только чтобы убедиться. – 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 пользователь не обновляется в базе данных, зная, что я получил это предупреждение в запросе обновления «Входные параметры могут использоваться только в где предложение или наличие предложения запроса ". –

+0

Это очень странно, но можете ли вы попытаться сделать весь запрос одной строкой без setParameter? Строка целое мне что-то вроде: "update User set username = '" + user.getUsername() + "' где username = '" + user.getUsername() + "'"; также попробуйте создатьNativeQuery вместо createQuery – giannisapi

+0

, кстати, кажется, что вы ничего не делаете с запросом u задаете имя пользователя, равное имени пользователя, если я не ошибаюсь :) – giannisapi

0

Вы не можете явно вызывать транзакцию в этом контексте. Фиксирование управляется сервером автоматически.

Вы можете просто использовать:

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

public void modifyUser(User user) { 
    em.merge(user)} 
Смежные вопросы