0

我正在尝试在 GAE/JDO 中查询 Long 类型的 ID 列表。当我在结果集上调用 detachCopyAll() 时出现以下异常。

org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class "java.lang.Long" 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)
at org.datanucleus.jdo.JDOPersistenceManager.jdoDetachCopy(JDOPersistenceManager.java:1110)
at 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;
}
4

1 回答 1

1
    List<Long> resultList = (List<Long>) query.execute(email);          

    // next line causes the ClassNotPersistenceCapableException
    keyList = (List<Long>) pm.detachCopyAll(resultList);

我不明白你在这里做什么。AList<Long>不必分离。您想分离 User 实体类的实例,但 Long 是 Long,您可以对resultList.

错误消息令人困惑,但只是由 Long 不是实体类引起的。

于 2011-12-04T06:37:22.027 回答