更新/删除查询中的javax.persistence.TransactionRequiredException
我正在开发一个简单的应用程序,其中数据库中的用户记录显示在primefaces数据表中,用户可以编辑或删除记录。 这是jsf文件更新/删除查询中的javax.persistence.TransactionRequiredException,java,jpa,primefaces,Java,Jpa,Primefaces,我正在开发一个简单的应用程序,其中数据库中的用户记录显示在primefaces数据表中,用户可以编辑或删除记录。 这是jsf文件 <h:form> <p:dataTable var="user" value="#{userBean.users}" > <p:column headerText="username"> <h:inputText value="#{
<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>
下面是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
谁能告诉我问题出在哪里。请尝试以下方法:
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();
如果这能解决您的问题,请告诉我。请尝试以下方法:
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();
请告诉我这是否解决了您的问题。在此上下文中无法显式调用事务。提交由服务器自动管理 您可以简单地使用:
user.setName("NEW USER NAME");
modifyUser(user);
public void modifyUser(User user) {
em.merge(user)}
在此上下文中不能显式调用事务。提交由服务器自动管理 您可以简单地使用:
user.setName("NEW USER NAME");
modifyUser(user);
public void modifyUser(User user) {
em.merge(user)}
首先我要做的是em.getTransaction().isActive(),看看是否真的没有活动事务。请检查此项并更新。我在updateUser(用户)方法的开头写了这一行,“System.out.println(“active”+em.getTransaction().isActive();”,它在控制台中打印了“active false”。好的,这意味着事务不是活动的,所以现在我们可以集中精力解决这个问题,我告诉你这样做只是为了确保。为什么不直接调用em.remove(user);和em.merge(user);?我尝试删除用户,然后将其合并,但出现异常。我认为异常的原因是数据库有一个表示用户id的自动递增列。首先,我要做的是em.getTransaction().isActive(),看看是否真的没有活动事务。请检查此项并更新。我在updateUser(用户)方法的开头写了这一行,“System.out.println(“active”+em.getTransaction().isActive();”,它在控制台中打印了“active false”。好的,这意味着事务不是活动的,所以现在我们可以集中精力解决这个问题,我告诉你这样做只是为了确保。为什么不直接调用em.remove(user);和em.merge(user);?我尝试删除用户,然后将其合并,但出现异常。我认为异常的原因是数据库有一个表示用户id的自动递增列。deleteUser方法解决了这个问题,并从数据库中删除了用户,但在updateUser方法中,数据库中没有更新用户,因为知道我在更新查询中得到了这个警告“输入参数只能在查询的where子句或having子句中使用”。这很奇怪,但是您可以尝试将整个查询设置为一个字符串,而不使用setParameter吗?整个字符串类似于:“update User set username='”+User.getUsername()+“'where username='”+User.getUsername()+“'"; 另外,请尝试createNativeQuery而不是createQueryby,因为您似乎没有对query执行任何操作(如果我没有弄错的话,请将用户名设置为用户名):)另外,当您没有更改任何值时,如何知道用户没有被更新?尝试切换jpa以打印执行的查询,并查看是否正在向数据库发送更新您是对的:),问题出在查询中。当按下save buyyon时,我要编辑的用户将调用saveAction方法,但我还需要在按下edit按钮后输入新用户,但我不知道如何获取新用户,我现在拥有的只是旧用户。您知道如何在编辑后获得新用户吗?。提前感谢:)deleteUser方法解决了这个问题,它从数据库中删除了用户,但是在updateUser方法中,用户在数据库中没有更新,因为我知道我在更新查询中得到了这个警告“输入参数只能用于查询的where子句或having子句”。这很奇怪,但是,您可以尝试将整个查询设置为一个字符串,而不使用setParameter吗?整个字符串类似于:“updateuser set username='”+User.getUsername()+”,其中username='“+User.getUsername()+”;另外,请尝试createNativeQuery而不是createQueryby,因为您似乎没有对query执行任何操作(如果我没有弄错的话,请将用户名设置为用户名):)另外,当您没有更改任何值时,如何知道用户没有被更新?尝试切换jpa以打印执行的查询,并查看是否正在向数据库发送更新您是对的:),问题出在查询中。当按下save buyyon时,我要编辑的用户将调用saveAction方法,但我还需要在按下edit按钮后输入新用户,但我不知道如何获取新用户,我现在拥有的只是旧用户。您知道如何在编辑后获得新用户吗?。提前感谢:)