【发布时间】:2011-12-04 06:23:05
【问题描述】:
我正在尝试在 GAE/JDO 中查询 Long 类型的 ID 列表。当我在结果集上调用 detachCopyAll() 时出现以下异常。
org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class "java.lang.Long" is not persistable. 这意味着它要么没有被增强,要么文件的增强版本不在CLASSPATH(或被未增强的版本隐藏),或找不到该类的元数据/注释。”是不可持久的。这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中(或者被未增强的版本隐藏),或者找不到该类的元数据。
在 org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:241)
在 org.datanucleus.jdo.JDOPersistenceManager.jdoDetachCopy(JDOPersistenceManager.java:1110)
在 org.datanucleus.jdo.JDOPersistenceManager.detachCopyAll(JDOPersistenceManager.java:1183)
...
我可以查询用户对象的列表并将它们分离就可以了。我希望所有像 Long 这样的原始包装类都是可持久的。我究竟做错了什么?下面是我正在使用的代码。
@PersistenceCapable(identityType=IdentityType.APPLICATION, detachable="true")
public class User
{
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
private Long id;
private String email;
}
@SuppressWarnings("unchecked")
public static List<Long> getUserKeys(String email)
{
assert email != null;
List<Long> keyList = null;
PersistenceManager pm = null;
Query query = null;
try {
pm = PMF.get().getPersistenceManager();
query = pm.newQuery("select id from " + User.class.getName());
query.declareParameters("String emailParam");
query.setFilter("email == emailParam");
List<Long> resultList = (List<Long>) query.execute(email);
// next line causes the ClassNotPersistenceCapableException
keyList = (List<Long>) pm.detachCopyAll(resultList);
}
finally {
if (query != null) query.closeAll();
if (pm != null) pm.close();
}
return keyList;
}
【问题讨论】:
标签: google-cloud-datastore jdo datanucleus jdoql