我有以下代码,我正在尝试删除所有类别,但它给我带来了非法的参数异常。我正在使用谷歌应用引擎。
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
答案 0 :(得分:1)
delete
语句中使用别名,因此您可以从JPQL中删除cat
。catch
阻止部分中的交易。EntityManager
,通常是finally
阻止。以下是代码的外观
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