使用Google应用引擎数据存储加载一系列枚举

时间:2009-09-30 21:01:35

标签: java google-app-engine jdo

我正在使用带有Java的Goole应用引擎数据存储区并尝试使用枚举列表加载对象。每次加载对象时,List都为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插件创建了我的项目,据我所知,没有对数据存储设置进行任何更改。那么为什么我的枚举列表为null?

2 个答案:

答案 0 :(得分:5)

是,但您的列表字段在加载时不在默认提取组中,因此未加载。 阅读JDO Fetch Groups。您可以将其添加到DFG,或启用自定义提取组,或者在关闭PM之前“触摸”该字段。

- 安迪(DataNucleus

答案 1 :(得分:1)

您是如何创建ObjectToSave的实例的?所有实例变量引用类型的默认值都为null,因此除非您有(附加)代码来创建List<AnEnum>的实例并将其分配给anEnumList,否则将为null。