JDO MakePersistent覆盖以前的条目

时间:2013-03-06 20:42:37

标签: google-app-engine gwt google-cloud-datastore jdo datanucleus

我正在使用JDO在GAE中为GWT项目存储对象。我在创建新对象时遇到问题。它在我第一次创建对象时效果很好。然而第二次,它用另一个Key值覆盖前一个,我觉得很奇怪。我应该说,如果刷新页面,我可以创建一个新对象。这是我正在使用的代码。 post参数是一个新对象,我认为数据存储区实体上的新ID证明了这一点。我不明白的是我以前创建的对象去了哪里。

public static Post addPost(Post post) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    Transaction tx = pm.currentTransaction();
    try{
        tx.begin();
        post.getTopic().addPost(post);
        pm.makePersistent(post.getTopic());
        pm.detachCopyAll(post.getTopic());
        tx.commit();

    } finally {
        if (tx.isActive())
            tx.rollback();
        pm.close();
    }
    return post;
}

2 个答案:

答案 0 :(得分:0)

建议您注意object lifecycle state。根据公开可用的JDO规范,将瞬态对象传递给持久化将持续存在。您的Post类没有显示,也没有显示它在输入时的值或数据存储区中的值,也没有显示日志(它告诉您PUT是什么)

答案 1 :(得分:0)

我现在解决了我的问题,它与数据存储没有任何关系。问题是我的主题是从客户端传来的。此主题在页面加载时更新,之后从未更新。因此,我总是将旧主题传递给没有新增帖子的功能。因此,它将“覆盖”主题帖子列表中的前一个元素。我在向服务器端添加新帖子之前在服务器端查找主题解决了这个问题。