2011-06-30 46 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