2009-08-02 61 views
0

我有兩個類擁有一對多的關係。父母是Map,孩子是POI(興趣點)。我正在嘗試將POI添加到現有地圖,但是當我試圖保留更改時發生異常。這裏有兩類:如何使用App Engine將子對象添加到父級?

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Map { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent(mappedBy = "map") 
    private List<Poi> pois; 

    public List<Poi> getPois() { 
     return pois; 
    } 
} 

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Poi { 

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

    @Persistent 
    private Map map; 

    public Map getMap() { 
     return map; 
    } 
    public void setMap(Map map) { 
     this.map = map; 
    } 
} 

,這裏是我怎麼想使用它們:

PersistenceManager pm = PMF.get().getPersistenceManager(); 

// create a new POI 
Poi poi = new Poi(); 

// find the Map by its ID 
Map map = pm.getObjectById(Map.class, Long.decode(mapId)); 

// add the POI to the map 
map.getPois().add(poi); 

// persist! 
pm.makePersistent(map); 
pm.close(); 

線 「map.getPois()加(POI);」拋出一個異常說「java.lang.ClassCastException:java.lang.Long」,但不告訴我爲什麼。如果我切換到「poi.SetMap(map);」它只是默默地失敗。沒有錯誤信息,沒有任何反應。

有人知道如何正確處理App Engine中的一對多關係嗎?有人知道任何好的資源嗎? Google's documentation一直很有幫助,但它真的很缺乏。

回答

0

首先要檢查的是,您使用的是sdk的1.2.2版本。在release中對子/父功能進行了許多修復/增強。 其中一個issue被修復聽起來很像您的問題,或至少相關。

如果這樣不能解決問題,請檢查您使用上述代碼的類是否註釋了@PersistenceAware,假設它尚不是@PersistenceCapable。

如果不能解決問題,你可以發佈導致問題的完整類(最好減少到只會重現異常的最小代碼)在你的摘錄例如,我們不會沒有看到原始地圖被創建和保存,也沒有看到mapId來自哪裏。

0

我不確定你的地圖是否是最好的抽象。我不知道Poi是什麼。谷歌告訴我這是夏威夷的食物。

但Google也顯示我與JDO how to do a one-to-many unidirectional relationship。我在代碼中看不到任何一個註釋。那是你想要做什麼?如果是這樣,也許這就是你想要的。

+0

POI =興趣點,如帖子第二句所定義:) – 2009-08-02 20:49:43

+0

另外,海報使用的是JDO,而不是JPA,它們相似但不相同。 – 2009-08-02 20:56:28

相關問題