-2

到目前为止,我一直在使用 Objectify,但现在我必须使用 JDO 处理一些代码。我在使用 Objectify 很容易的基本东西上遇到问题,特别是:如果一个对象有一个 List 或一个数组作为成员,我不能让它持久化。

我有一个包含 FileInfo 列表的类 FileInfoBatch(代码缩进在这里丢失,不知道为什么):

@PersistenceCapable
public class FileInfoBatch implements Serializable{

private static final long serialVersionUID = 1L;        
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private List<FileInfo> fileInfoList;    

@Persistent    
private String savedByUserEmail;

public FileInfoBatch(){         
    fileInfoList=new ArrayList<FileInfo>();     
}

然后我向我的 RPC impl 类发送一个仅包含 1 个 FileInfo 的 FileInfoBatch(称为 fib)到我的 RPC impl 类并保存它,然后立即查询它以进行测试(在调试器中)

    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.makePersistent(fib);
    Query query = pm.newQuery(FileInfoBatch.class, "savedByUserEmail == '"+ userEmail + "'");
    List<FileInfoBatch> savedList = (List<FileInfoBatch>) query.execute();
    FileInfoBatch persisted=savedList.get(0);

持久化的 FileInfoBatch 返回一个空的 FileInfo 列表。如果我使用单个 Fileinfo 成员,这仍然存在。

我发现此站点上没有报告此类基本问题,并且我查看了文档: https ://developers.google.com/appengine/docs/java/datastore/jdo/dataclasses

如此简单的存储任务是否需要巨大的复杂性?如果是这样,我将回到使用 Objectify。

4

1 回答 1

0

定义“不持久”?您是否查看过日志(它告诉您实体的 PUT 中包含的内容)或数据库查看器中的持久化内容?“FileInfo”是否标记为 PersistenceCapable?

它很可能是持久的,但是您没有注意定义获取的内容(在 JDO 中,您可以完全控制检索到的对象中的内容)。建议您阅读http://www.datanucleus.org/products/accessplatform_3_1/jdo/object_lifecycle.htmlhttp://www.datanucleus.org/products/accessplatform_3_1/jdo/fetchgroup.html

您使用的是最新版本的“datanucleus-appengine”吗?(即v2.0 或更高版本);旧版本不值得努力。

PS,你不需要 @Persistent 字段类型,如字符串,键 - 让事情看起来更干净。

FWIW:JDO 提供了与现有选项一样简单的持久性选择,与其他选项一样透明,并且由规范定义的语义比其他选项更详细。

于 2012-10-28T16:24:44.103 回答