【问题标题】:Why is java.lang.Long not persistable?为什么 java.lang.Long 不能持久化?
【发布时间】: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


    【解决方案1】:
        List<Long> resultList = (List<Long>) query.execute(email);          
    
        // next line causes the ClassNotPersistenceCapableException
        keyList = (List<Long>) pm.detachCopyAll(resultList);
    

    我不明白你在这里做什么。 List&lt;Long&gt; 不必分离。您想要分离 User 实体类的实例,但 Long 是 Long,您可以使用 resultList 做任何您需要做的事情。

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

    【讨论】:

    • Longs 实际上必须分离。否则,如果您在 PersistenceManager 关闭后尝试使用查询中的任何数据,您将收到以下异常。试试吧。 org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed 但由于我无法分离 List,我必须在循环中手动复制其元素。这似乎是 DataNucleus 的疏忽。
    • 不,您分离一个 Long。根据 JDO 规范和 DataNucleus 文档,传递给 detachCopyAll 的对象应该是可持久的类型,并由 Thilo 回复。
    • 如果我不需要分离List&lt;Long&gt;,那么为什么我在尝试使用对象管理器时收到已关闭异常?
    • @DataNucleus 这是我现在使用的解决方法,而不是 detachCopyAll() keyList = new ArrayList&lt;Long&gt;(resultList.size()); for (Long uid : resultList) { keyList.add(uid); }
    • 您得到“ObjectManager 尚未关闭”,因为 Google 没有费心向他们的插件添加逻辑以在连接关闭之前读取所有结果。即与分离无关。如前所述,您只能分离可持久化的对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2021-06-24
    • 2018-09-13
    • 2010-10-17
    相关资源
    最近更新 更多