Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新/删除查询中的javax.persistence.TransactionRequiredException_Java_Jpa_Primefaces - Fatal编程技术网

更新/删除查询中的javax.persistence.TransactionRequiredException

更新/删除查询中的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="#{

我正在开发一个简单的应用程序,其中数据库中的用户记录显示在primefaces数据表中,用户可以编辑或删除记录。 这是jsf文件

<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按钮后输入新用户,但我不知道如何获取新用户,我现在拥有的只是旧用户。您知道如何在编辑后获得新用户吗?。提前感谢:)