我是JDO及其概念的新手。我以前使用过ORMLite,这很简单,而且我不知道该如何在JDO中做我在ORMLite中所做的事情。
我有2个实体,BroadcastMovie。每个Broadcast都有一个Movie,一个Movie可以有多个Broadcasts
广播的ID不会生成,它是在持久存储之前进行配置的。
这就是我所做的:

@PersistenceCapable
public class Broadcast {

    @PrimaryKey
    private String id;

    @Persistent
    private Movie movie;

    //More fields....
}


现在,这是Movie类(同样不会生成ID,它是在保存对象之前配置的):

@PersistenceCapable
public class Movie {

    @PrimaryKey
    private String id;

    @Persistent(mappedBy = "movie")
    private List<Broadcast> broadcasts;

    //More fields....
}


现在,我有一个servlet,它正在提取所有数据并将其保存在DB中。
首先,我获取所有Broadcasts,对于每部Broadcast电影,我所知道的都是标题及其ID,因此我将BroadcastMovie对象一起保存在事务中(因为在那里是保存的两个对象,因此必须是原子操作):

// Check if this broadcast already exist.
try {
     mgr.getObjectById(Broadcast.class, brdcst.getId());
} catch (Exception e) {
     if(e instanceof JDOObjectNotFoundException){
    Transaction tx = null;
    try{
        tx = mgr.currentTransaction();
        tx.begin();
        mgr.makePersistent(brdcst);
        tx.commit();
    }
    catch(Exception e1){
        sLogger.log(Level.WARNING, e.getMessage());
    }
    finally{
        if (tx.isActive()) {
            tx.rollback();
        }
        mgr.flush();
    }

     }
     else sLogger.log(Level.WARNING, e.getMessage());
}


然后,我要获取电影的数据并以相同的ID进行保存,以覆盖先前的对象(在另一个未引用Broadcast对象的线程中)。

try {
    sLogger.log(Level.INFO, "Added the movie: " + movie);
    mgr.makePersistent(movie);
} catch (Exception e) {
    e.printStackTrace();
}
finally{
    mgr.flush();
}


因此,要清楚一点,这就是ORMLite中发生的事情以及我想在这里发生的事情。
保存Broadcast对象时,我要为其添加具有ID的电影,因此将来使用此ID可以帮助他在数据库中引用其Movie

但是每当我在数据库中查询广播并希望在其中查找对电影的引用时,我得到的都是null或以下异常:

Field Broadcast.movie should be able to provide a reference to its parent but the entity does not have a parent.  Did you perhaps try to establish an instance of Broadcast as the child of an instance of Movie after the child had already been persisted?


那么,我在这里做错了什么?

最佳答案

要在GAE中使用关系,必须使用com.google.appengine.api.datastore.Key而不是长键或字符串键。 Example

10-06 08:48