【问题标题】:The class "The class "com.google.appengine.api.datastore.Key" is not persistable类“类“com.google.appengine.api.datastore.Key”不可持久
【发布时间】:2011-08-14 14:46:56
【问题描述】:

我正在尝试删除给定键列表的多个实体,即:

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。

谢谢

【问题讨论】:

    标签: google-app-engine jdo


    【解决方案1】:

    您只能删除一个持久对象(您传递给 pm.deletePersistentAll 的内容)。 “键”不是持久对象

    【讨论】:

    • 有没有办法通过它的键删除一个实体?我必须先加载每个对象才能删除它,这似乎有点奇怪。
    • pm.deletePersistent 也处理级联删除等。仅仅从数据存储中删除某些东西就有可能留下孤儿和不正确的关系,因此任何理智的对象持久性 API 都不允许这样做。您可以执行 Query q = pm.newQuery(...) 来选择要删除的对象并调用 q.deletePersistentAll()。
    【解决方案2】:

    要按键删除实体,试试

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

    【讨论】:

    • 如果其他对象引用了这个(例如,使用 GAE/J 最新存储版本,父级持有子级的密钥),那么这样做会留下尾随引用。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2015-12-20
    • 2022-01-14
    • 2019-04-05
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多