【问题标题】:How to add a child object to a parent with App Engine?如何使用 App Engine 将子对象添加到父对象?
【发布时间】:2009-08-02 18:17:52
【问题描述】:

我有两个属于一对多关系的类。父级是 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 中正确处理一对多关系吗?有人知道有什么好的资源吗? Google's documentation 提供了一些帮助,但确实缺乏。

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

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

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

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

    【讨论】:

    • 更新到最新版本的 SDK 效果很好!几周前我还在使用 1.2.1 - 我要花很长时间才能弄清楚。
    【解决方案2】:

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

    但 Google 也向我展示了带有 JDO 的 how to do a one-to-many unidirectional relationship。我在您的代码中看不到任何一对多的注释。那是你想要做的吗?如果是这样,也许这就是您所缺少的。

    【讨论】:

    • POI = 兴趣点,如帖子第二句中所定义:)
    • 另外,发帖者使用的是JDO,而不是JPA,两者相似但不一样。
    • 我会输入它:PointOfInterest 更能自我记录 POI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2022-01-19
    • 2014-09-14
    • 2023-01-19
    相关资源
    最近更新 更多