2011-06-30 48 views
3

我正在清理掉我的谷歌应用程序引擎/数据存储技能......并陷入了非常简单的事情。谷歌数据存储 - 更新实体问题

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

任何帮助表示赞赏!

+2

“这不起作用!”不是一个好的声明。在控制台日志中看到的确切错误是什么? –

+0

我在控制台日志中没有看到任何东西 - 一切看起来都不错,但是当我查看数据存储区时(或尝试将实体拉出,旧值仍然存在),更改不会持久保留 – JohnIdol

回答

2

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

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

你可以用,当你创建对象,因为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()调用,它应该直接设置字段值,甚至工作。

+1

供参考JDO监视方式更改为* public *字段直接将标记为@PersistenceAware的调用类。另一方面,JPA没有这种方式,所以最好坚持JDO – DataNucleus

+0

我会尽快给出这个答案。我很懒,没有提供任何setter,因为它只是一个测试 - 感谢这个伟大的建议 – JohnIdol

+0

@DataNucleus - JPA和JDO之间的选择实际上是个人偏好的问题。就我个人而言,我觉得JDO是一个相当差的选择,但是对于他自己来说。无论如何,我认为监控直接向公共领域所做变更的能力是选择JDO的一个充分理由。在一个设计良好的应用程序中,你通常没有或者设置公共字段。 – aroth