【问题标题】:JDO MakePersistent overwrite previous entryJDO MakePersistent 覆盖先前的条目
【发布时间】:2013-02-21 20:21:11
【问题描述】:

我正在使用 JDO 为 GWT 项目在 GAE 中存储对象。我在创建新对象时遇到问题。我第一次创建对象时效果很好。然而第二次,它用另一个我觉得很奇怪的 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;
}

【问题讨论】:

  • 如果我正确理解了您的问题,您需要查找当前持久化的Topic,用新值更新它,然后再次持久化它。正如 DN 在他的回答中所说,持久化一个 Transient(即我不确定那是什么,但假设它是一个新创建的 java 对象),只会持久化一个新对象。我猜数据存储应用了覆盖机制,而不是 DN(即由于唯一密钥违规)。我可以问一下,如果你不归还它,你为什么要把它分开?我还在学习,所以我不会反对你的代码或任何东西。
  • 您好,感谢您的回答!它帮助我以其他方式思考它并帮助我解决问题。我真的没有任何解释要分离它。我补充说的只是一些绝望的“也许这会有所帮助”。后来删除了该行,因为它没有任何效果。

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


【解决方案1】:

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

【讨论】:

  • 我仍在尝试使用 JDO 掌握对象生命周期,所以这是我的问题,它与原始问题有关。要更新当前持久化的对象,我应该查找它,而不是分离它,关闭PersistenceManager,在查找方法之外更新对象,然后打开一个全新的PersistenceManager 并用它的更新值持久化对象?更新现有对象可以正常工作吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多