Java JPA删除所有不在谷歌应用程序引擎上工作的内容

Java JPA删除所有不在谷歌应用程序引擎上工作的内容,java,google-app-engine,jpa,Java,Google App Engine,Jpa,我有下面的代码,并试图删除所有的类别,但它是抛出我非法参数异常。我正在使用谷歌应用程序引擎 public void deleteCategories() { EntityManager em = EMFService.get().createEntityManager(); try { em.getTransaction().begin(); Query q = em.createQuery("DELETE FROM Category cat");

我有下面的代码,并试图删除所有的类别,但它是抛出我非法参数异常。我正在使用谷歌应用程序引擎

public void deleteCategories() {
  EntityManager em = EMFService.get().createEntityManager();



  try {

      em.getTransaction().begin();
      Query q = em.createQuery("DELETE FROM Category cat");
      q.executeUpdate();
      em.getTransaction().commit();
      System.out.println("All records are deleted.");
  } catch(Exception ex){
      System.out.println(ex.toString());

  }
  finally {
      if (em.getTransaction().isActive()) {
          em.getTransaction().rollback();
      }
  }
  }
运行这段代码后,我得到javax.persistence.PersistenceException:invalical参数,完整堆栈跟踪如下 原因:java.lang.IllegalArgumentException:需要显式指定跨组事务,请参阅TransactionOptions.Builder.withXGfound这两个元素{ 类型:“类别” 名称:“1” } 和元素{ 类型:“类别” 姓名:“100223” }


猫在你的查询中做什么?我想这就是错误所在,因为用于删除行的常规查询模式如下所示,不需要使用别名:

从mytablename中删除*

从mytablename中删除

也许您可以进一步检查已回答的问题->

  • delete
    语句中不需要使用别名,因此您可以从JPQL中删除
    cat
  • 您应该只回滚
    catch
    块部分中的事务
  • 您应该始终在使用
    EntityManager
    后关闭它,通常在
    finally
    块中
  • 您只打印stacktrace的第一行。这是个坏习惯。相反,在公共输出中打印stacktrace。或者更好的方法是,使用一个日志记录器来为您处理日志文件和异常打印
  • 下面是代码的外观

    public void deleteCategories() {
        EntityManager em = EMFService.get().createEntityManager();
        try {
            em.getTransaction().begin();
            Query q = em.createQuery("DELETE FROM Category");
            q.executeUpdate();
            em.getTransaction().commit();
            System.out.println("All records are deleted.");
        } catch(Exception ex){
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            //should be changed for something like
            //log.error("Error while deleting all the categories", ex);
            ex.printStacktrace(System.out);
        } finally {
            em.close();
        }
    }
    

    感谢Luiggi,但在使用上述方法后,我变得很严重:javax.persistence.PersistenceException:FROM子句的查询类为com.myapp.model.Category,但没有别名我通过输入persistene.xml为gae启用xg事务克服了这个异常,但现在我在一个单独的数据库中操作了太多的实体组交易我认为这与
    public void deleteCategories() {
        EntityManager em = EMFService.get().createEntityManager();
        try {
            em.getTransaction().begin();
            Query q = em.createQuery("DELETE FROM Category");
            q.executeUpdate();
            em.getTransaction().commit();
            System.out.println("All records are deleted.");
        } catch(Exception ex){
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            //should be changed for something like
            //log.error("Error while deleting all the categories", ex);
            ex.printStacktrace(System.out);
        } finally {
            em.close();
        }
    }