gpt4 book ai didi

java - JPA 删除所有不适用于 Google 应用引擎的内容

转载 作者:行者123 更新时间:2023-12-01 12:24:53 25 4
gpt4 key购买 nike

我有以下代码,并试图删除所有类别,但它引发了非法参数异常。我正在使用 Google 应用引擎。

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: Illegal argument 完整的堆栈跟踪如下引起原因:java.lang.IllegalArgumentException:跨组事务需要显式指定,参见TransactionOptions.Builder.withXGfound Both 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

最佳答案

  1. 无需在 delete 语句中使用别名,因此您可以从 JPQL 中删除 cat
  2. 您应该只回滚 catch block 部分中的事务。
  3. 使用后,您应该始终关闭 EntityManager,通常是在 finally block 中。
  4. 您仅打印堆栈跟踪的第一行。这是一个不好的做法。相反,在公共(public)输出中打印堆栈跟踪。或者更好的是,使用一个记录器来为您处理日志文件和异常打印。

代码应该是这样的

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

关于java - JPA 删除所有不适用于 Google 应用引擎的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26443097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com