0

我在拥有的一对多关系中有两个类。父级是 Map,子级是 POI(兴趣点)。我正在尝试将 POI 添加到现有地图,但当我尝试保留更改时出现异常。这是两个类:

@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().add(poi);” 抛出一个异常说“java.lang.ClassCastException:java.lang.Long”,但没有告诉我为什么。如果我将它切换到“poi.SetMap(map);” 它只是默默地失败了。没有错误消息,也没有任何反应。

有人知道如何正确处理 App Engine 中的一对多关系吗?有人知道有什么好的资源吗?谷歌的文档有点帮助,但确实缺乏。

4

2 回答 2

0

我不确定您的 Map 是这里最好的抽象。我不知道Poi是什么。谷歌告诉我这是夏威夷菜。

但 Google 也向我展示了如何与 JDO建立一对多的单向关系。我在您的代码中看不到任何一对多的注释。那是你想要做的吗?如果是这样,也许这就是您所缺少的。

于 2009-08-02T18:27:46.700 回答
0

首先要检查的是您使用的是 1.2.2 版本的 sdk。在此版本中,对子/父功能进行了许多修复/增强。一个已修复的问题听起来很像您的问题,或者至少是相关的。

如果这不能解决问题,请检查您使用上述代码的类是否已注释 @PersistenceAware,假设它还不是 @PersistenceCapable。

如果不能解决问题,您能否发布导致问题的完整类(最好减少到会重现异常的最少代码)例如,在您的摘录中,我们看不到原始地图被创建和保存,并且看不到 mapId 来自哪里。

于 2009-08-02T21:06:48.330 回答