2011-08-14 27 views
0

我想给键列表删除多个实体,即:类“类‘com.google.appengine.api.datastore.Key’不是可持久化

List keys = obj.getKeys(); pm.deletePersistentAll(keys); 

然而,当我尝试删除我得到下面的异常的实体:

javax.jdo.JDOUserException: One or more instances could not be deleted 
at org.datanucleus.jdo.JDOPersistenceManager.deletePersistentAll(JDOPersistenceManager.java:809) 
at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager.access$301(DatastoreJDOPersistenceManager.java:39) 
at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager$2.call(DatastoreJDOPersistenceManager.java:112) 
at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager$2.call(DatastoreJDOPersistenceManager.java:110) 
at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager$BatchManagerWrapper.call(DatastoreJDOPersistenceManager.java:125) 
at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager$BatchManagerWrapper.access$200(DatastoreJDOPersistenceManager.java:121) 
at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager.deletePersistentAll(DatastoreJDOPersistenceManager.java:110) 

    NestedThrowablesStackTrace: org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class "com.google.appengine.api.datastore.Key" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found." is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data for the class is not found. 
at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:241) 

有没有人经历过这个,我确信我的类增强,所有类的已被标记为PersistenceCapable

感谢?

回答

0

你只能删除一个持久对象(你传递给pm.deletePersistentAll的东西)。 “钥匙”是不是一个持久化对象

+0

请问有没有办法通过其键删除实体?似乎有点奇怪,我必须首先加载每个对象才能删除它。 – Mylo

+0

pm.deletePersistent也处理级联删除等。从数据存储中删除一些东西会给孤儿和不正确的关系带来风险,因此为什么任何理智的对象持久性API都不会允许它。您可以执行Query q = pm.newQuery(...)来选择要删除的对象并调用q.deletePersistentAll()。 – DataNucleus

0

要删除的密钥的实体,尝试

DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); 
ds.delete(key) 
+0

如果一些其他对象引用了这个(例如使用GAE/J最新的存储版本,则父母持有孩子的密钥),那么这样做会留下尾随引用。 – DataNucleus

相关问题