gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:37:24 25 4
gpt4 key购买 nike

我正在重温我的 google 应用引擎/数据存储技能......并且卡在了一些非常简单的事情上。

根据 the example on the GAE documentation我正在尝试按如下方式更新实体:

// 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;
}

感谢任何帮助!

最佳答案

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

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

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

此外,您是否尝试过使用 JPA 接口(interface)而不是 JDO 接口(interface)?在 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() 调用,即使直接设置字段值也应该可以正常工作。

关于java - Google Datastore - 更新实体时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com