繁体   English   中英

Google Datastore - 更新实体时出现问题

[英]Google Datastore - Problems updating entity

我正在清理我的谷歌应用程序引擎/数据存储技能......并陷入非常简单的事情。

根据GAE 文档中的示例,我正在尝试按如下方式更新实体:

// persistence and business logic
PersistenceManager pm = PMF.get().getPersistenceManager();

// get it
NickName n = pm.getObjectById(NickName.class, nicknameId);

// update fields
n.givenName = "new name";
n.nickName = "new nickname";
n.timeStamp = new Date();               

// close manager to persist changes
pm.close();

这不起作用(因为更改没有持久化,但没有错误或其他任何东西)!

同时我发现,如果我创建一个具有相同 ID 的新实体,更改会保持不变:

// persistence and business logic
PersistenceManager pm = PMF.get().getPersistenceManager();

NickName n = new NickName("new name", "new nickname", new Date());

// set id
n.id = nicknameId;

pm.makePersistent(n);

pm.close();

我觉得我第一次接触应用程序引擎和数据存储时已经解决了这个问题。

这是我的实体的样子:

@PersistenceCapable
public class NickName {

    public NickName(String name, String nickname, Date timestamp) {
        this.givenName = name;
        this.nickName = nickname;
        this.timeStamp = timestamp;
    }

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    public String id;

    @Persistent
    public String givenName;

    @Persistent
    public String nickName;

    @Persistent
    public Date timeStamp;
}

任何帮助表示赞赏!

一个问题可能是您直接设置字段,而不是通过 setter 方法。 我相当肯定 JDO 通过检测字段设置器来工作,以便它们通知持久层发生的任何更改。 它无法直接监控对支持字段值本身的更改。 所以也许尝试:

n.setGivenName("new name");
n.setNickName("new nickname");
n.setTimeStamp(new Date()); 

您可以在创建 object 时直接设置字段,因为makePersistent()调用告诉持久性管理器需要检查字段值并保存它们。 虽然值得注意的是,像这样直接设置字段值通常被认为是糟糕的编码风格。

另外,您是否尝试过使用 JPA 接口而不是 JDO 接口? 在 GAE 中,它们应该是可互换的:

EntityManager em = EMF.get();

NickName n = em.find(NickName.class, nicknameId);

n.givenName = "new name";
n.nickName = "new nickname";
n.timeStamp = new Date();    

em.merge(n);

em.close();

这为您提供了一个明确的merge()调用,即使直接设置字段值也应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM