使用Google App Engine数据存储加载枚举集合

3

我正在使用Java的Google应用引擎数据存储,并尝试加载一个具有枚举列表的对象。每次加载对象时,列表都是null。该对象为:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class ObjectToSave {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private List<AnEnum> anEnumList;

    //public getters and setters
}

枚举类型很简单

public enum AnEnum {
    VALUE_1,
    VALUE_2;
}

保存它的代码是:
ObjectToSave objectToSave = new ObjectToSave();
List<AnEnum> anEnumList = new ArrayList<AnEnum>();
anEnumList.add(AnEnum.VALUE_1);
objectToSave.setAnEnumList(anEnumList);
PersistenceManager pm = pmfInstance.getPersistenceManager();
try {
    pm.makePersistent(objectToSave);
} finally {
    pm.close();
}

加载它的代码是:
PersistenceManager pm = pmfInstance.getPersistenceManager();
try {
    Key key = KeyFactory.createKey(ObjectToSave.class.getSimpleName(), id);
    ObjectToSave objectToSave = pm.getObjectById(ObjectToSave.class, key);
} finally {
    pm.close();
}

我可以使用http://localhost:8080/_ah/admin查看数据存储中的数据,我能看到我的列表已经被保存,但是在对象加载时它并不存在。我使用Eclipse插件创建了我的项目,并且据我所知没有更改过数据存储设置。那么为什么我的枚举列表为空?

1
你能展示一下将列表赋值给anEnumList的代码吗? - Yishai
对象中的其他字段是否被正确保存? - Peter Recore
我已更新问题以显示枚举列表的创建。此外,我未在此处添加的其他值正在被保存,并设置了主键。 - Chris
我稍微修改了我的问题,因为我现在可以看到数据已经保存,但是没有加载。 - Chris
2个回答

5
是的,但是你的List字段在加载时不在默认的获取组中,因此未被加载。请阅读JDO Fetch Groups。您可以将其添加到DFG中,或启用自定义获取组,或者在关闭PM之前只需“触摸”该字段。
--Andy(DataNucleus

1
你是如何创建 ObjectToSave 的实例的?所有实例变量引用类型的默认值都是 null,所以除非你有(额外的)代码来创建 List 的实例并将其分配给 anEnumList,否则 null 是预期的。

我正在使用调试器将一个值设置到列表中,我可以在保存对象之前看到它已经被设置。我已经更新了问题,试图使其更清晰。 - Chris
也许你需要将enum声明标记为@PersistenceCapable? - Patrick Schneider
一个子对象集合(由@PersistenceCapable类创建)可以创建具有一对多关系的多个实体。请参阅关系。 - Patrick Schneider
子对象"AnEnum"不是持久化对象,它们也不应该是。JDO支持枚举类型的持久化。 - DataNucleus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接