繁体   English   中英

JPA删除所有不适用于Google App引擎的内容

[英]JPA delete all not working on Google app engine

我有以下代码,并试图删除所有类别,但是这使我抛出非法参数异常。 我正在使用Google App Engine。

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:非法参数,完整的堆栈跟踪如下:原因:java.lang.IllegalArgumentException:需要明确指定跨组事务,请参见TransactionOptions.Builder.withXGfound两个元素{类型:“类别”名称:“ 1”}和元素{类型:“类别”名称:“ 100223”}

at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:39)
at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:76)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:94)
at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl$10.get(AsyncDatastoreServiceImpl.java:622)
at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl$10.get(AsyncDatastoreServiceImpl.java:618)
at com.google.appengine.api.datastore.FutureHelper$TxnAwareFuture.get(FutureHelper.java:171)
at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71)
at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32)
at com.google.appengine.api.datastore.DatastoreServiceImpl.delete(DatastoreServiceImpl.java:128)
at com.google.appengine.datanucleus.WrappedDatastoreService.delete(WrappedDatastoreService.java:184)
at com.google.appengine.datanucleus.query.DatastoreQuery.wrapEntityQueryResult(DatastoreQuery.java:417)
at com.google.appengine.datanucleus.query.DatastoreQuery.performExecute(DatastoreQuery.java:343)
at com.google.appengine.datanucleus.query.JPQLQuery.performExecute(JPQLQuery.java:176)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1789)
at org.datanucleus.store.query.Query.executeWithMap(Query.java:1693)
at org.datanucleus.api.jpa.JPAQuery.executeUpdate(JPAQuery.java:124)
... 28 more
  1. delete语句中无需使用别名,因此您可以从JPQL中删除cat
  2. 您只应在catch块部分中回滚事务。
  3. 使用EntityManager后,应始终关闭它,通常在finally块中。
  4. 您只打印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();
    }
}

在您的查询中做什么? 我猜这是错误,因为删除行的常规查询模式如下,因此无需使用别名:

删除*来自mytablename

要么

从mytablename删除

也许您可以在已经回答的问题中进一步检查-> 使用JPA从表中删除所有行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM