2009-07-16 106 views
0

我有三個實體的用戶,公司和地址與聲明,如下所示:問題與擁有一對一的關係,父/子關係

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class User implements Serializable { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent(mappedBy="creator") 
    @Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="title asc")) 
    private Collection<Company> companies; 

    @Persistent 
    private Address address; 
    . . . 
} 

public class Company implements Serializable { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent 
    @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true") 
    private Key creatorKey; 

    @Persistent 
    private User creator; 

    @Persistent 
    private Address address; 
    . . . 
} 

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Address implements Serializable{ 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 
    . . . 
} 

創建一個用戶後,我再堅持兩家公司用戶擁有設置它們的地址和其它信息,像這樣經過:

company.setCreatorKey(currentUser.getKey()); 
pm.makePersistent(company); 

當我取回公司,並從該對象引用的創建者,就會出現問題。顯然,JDO認爲,兩家公司的地址屬於相對於企業用戶,並記錄了以下錯誤:

address is mapped as a 1 to 1 relationship but there is more than one enity of kind Address that is a child of User([email protected]) 

用戶的關鍵是

User([email protected]) 

的關鍵公司是

User([email protected])\Company(1) 

和兩個地址的關鍵是

User([email protected])\Company(1)\Address(1) 
User([email protected])\Company(1)\Address(2) 

我對分層數據庫相當陌生,所以我想知道爲什麼這兩個地址被持續/解釋爲用戶的子代,而不是公司的用戶和子代的後代。什麼是這樣的情況正確的層次結構?謝謝。

回答

0

您使用的是什麼版本的應用引擎sdk?週一,他們發佈了一個新的JDO問題修復程序。 (release notes)四個或五個修補程序必須處理對象之間的關係,所以有可能這個問題已經被解決,或以新的方式被破壞:) OTOH,您的問題可能與此打開ticket有關。

我很新的分層數據庫,所以我想知道爲什麼這兩個地址是持續/解釋爲用戶的子女,而不是公司的用戶和子女的後代。

您所看到的關鍵層次結構基於實體組。隨着至於數據存儲而言,你可以有你的公司在不同的實體組不是用戶,造成這樣的關鍵結構:

User([email protected]) 
Company(1)\Address(1) 
Company(1)\Address(2) 

數據存儲不一定知道的一對一映射,或一對多映射。它只是讓你參考其他實體的鍵,不過你喜歡。但是,JDO層會自動將擁有關係中的所有實體放入同一個實體組中,據推測,這樣可以強制以事務性方式進行更改。

儘管如此,你的結構對我來說看起來還不錯。它看起來像JDO層只是檢查任何具有Kind Address的實體組後代,而不是專門查找公司的直接子代。

+0

下載新的SDK(1.2.2)工作。我以前使用的是1.2.1,它有問題/缺陷。謝謝彼得。 – 2009-07-17 18:48:17