JPA删除所有无法在Google应用引擎上运行的内容

时间:2014-10-18 18:25:22

标签: 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");
      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和Element {   类型:"类别"   名称:" 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

2 个答案:

答案 0 :(得分:1)

  1. 无需在delete语句中使用别名,因此您可以从JPQL中删除cat
  2. 您应该只回滚catch阻止部分中的交易。
  3. 使用后,您应该始终关闭EntityManager,通常是finally阻止。
  4. 您只打印堆栈跟踪的第一行。这是一种不好的做法。而是在公共输出中打印堆栈跟踪。或者甚至更好,使用一个处理日志文件和异常打印的记录器。
  5. 以下是代码的外观

    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();
        }
    }
    

答案 1 :(得分:0)

cat 在您的查询中做了什么?我猜这是错误,因为删除行的一般查询模式如下,不需要使用别名:

  

DELETE * FROM mytablename

OR

  

从mytablename删除

也许你可以在这个已经回答的问题中进一步检查 - > Removing all rows from a table using JPA

相关问题