我是JDO及其概念的新手。我以前使用过ORMLite,这很简单,而且我不知道该如何在JDO中做我在ORMLite中所做的事情。
我有2个实体,Broadcast
和Movie
。每个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,因此我将Broadcast
与Movie
对象一起保存在事务中(因为在那里是保存的两个对象,因此必须是原子操作):// 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