2009-08-02 68 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

相关问题