2010-07-18 85 views
1

我有兩個對象一個用戶和一個角色,我使用JDO和Google應用程序引擎進行持久化。這兩種數據類型彼此相關,因爲它們之間沒有多少關係。我試圖模仿那些在gae-tutorial中被描述爲持有相應對象的關鍵字的集合。當我創建我的對象時,這些鍵是空的。所以爲了獲得一些生成的密鑰,我使這些對象持久。之後,我將這些引用鍵添加到這些對象。但是這些密鑰最終沒有得到存儲。Google App Engine:存儲無主對多關係

除了設置鍵之外,我還操縱一些其他屬性(在makePersistent之後)。這些更改稍後會反映在數據存儲中。但是,在makePersistent之後所做的所有關鍵更改都不要交給數據存儲。如果我在makePersistent之前設置這些密鑰,它們就會按照它們的方式進行存儲。但是,這並不是解決方案,因爲至少有一個對象必須在持久化後才能在邏輯上接收密鑰引用。

下面是一些示例代碼,說明問題。

存儲這些密鑰的最佳做法是什麼?

持久化的作用類

public class Role { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key Role_id; 

    @Persistent 
    private Set<Key> Users = new HashSet<Key>(); 
... 
} 

持久化的用戶類其產生1個角色和1個用戶和試圖設置在兩側上的關鍵引用

public class User { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key User_id; 

    @Persistent 
    private String EMail = null; 

    @Persistent 
    private Set<Key> Roles = new HashSet<Key>(); 
    ... 
} 

代碼提取物。他們的關鍵變化不會在數據存儲中結束。但是,電子郵件地址的更改會寫入數據存儲區。 ...

PersistenceManager pm = PMF.get().getPersistenceManager(); 
    Role GlobalAdmin = new Role(); 
    User Daniel = new User(); 

    try { 
     pm.makePersistent(GlobalAdmin); 
     pm.makePersistent(Daniel); 
    } catch (Exception e){ 
     System.out.println("Storing failed: " + e.getMessage()); 
    } 

    GlobalAdmin.addUser(Daniel.getUser_id()); 
    Daniel.addRole(GlobalAdmin.getRole_id()); 
    Daniel.setEMail("[email protected]"); 

    pm.close(); 
... 
+0

沒有人知道如何回答這個簡單的問題嗎?看起來GAE並不像谷歌那樣受歡迎,而且VMWare會喜歡它...... – 2010-12-13 00:44:52

回答

0

我找到了解決我的問題的方法之一。當我想寫這些鍵時,我必須分離這些對象,並在以後再次使它們持久化。我也不明白爲什麼我必須這樣做,也不知道會不會有更優雅的東西。然而,它證明工作。

所以首先這些類必須是detechable:

@PersistenceCapable(detachable = "true") 
    public class User { 
    ... 

使物體持續性後,我脫離他們,把我的鑰匙和reatch這些對象的商店......

... 
    pm.makePersistent(GlobalAdmin); 
    pm.makePersistent(Daniel); 

    pm.detachCopy(GlobalAdmin); 
    pm.detachCopy(Daniel); 

    GlobalAdmin.addUser(Daniel.getUser_id()); 
    Daniel.addRole(GlobalAdmin.getRole_id()); 

    pm.makePersistent(GlobalAdmin); 
    pm.makePersistent(Daniel); 
    ... 
1

我認爲你應該閱讀datanucleus的文檔。這將解釋您目前的解決方案。

http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

JDO提供給 持久對象的接口。 JDO 1.0 沒有提供一種方法來取得剛剛保留的對象 ,並且 只是對它起作用,並稍後更新持久對象。用戶有 手動複製這些字段,然後將它們 複製回持久對象 。 JDO 2.0引入了一種處理這種情況的新方法 ,通過將 中的對象從持久性圖中分離出來, 允許它在 用戶應用程序中工作。然後它可以是 ,後面附加到持久性圖 。