我是JDO及其概念的新手。我之前和ORMLite一起工作非常简单,我不知道我应该如何在JDO中做我在ORMLite中做的事情。我有2个实体,Broadcast
和Movie
。每Broadcast
有一个Movie
和Movie
可以有许多s。 广播的id不会生成,它在持久化之前配置。 所以这是我做过什么:在JDO中使用一对多的关系 - AppEngine
@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即提取并保存数据库中的所有数据。 首先,我获取所有,因为我知道的每一个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
的引用。
但每当我查询DB的广播,并希望能找到在他们的电影引用了所有我得到的是空或此异常:
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?
那么,我究竟错在这里做什么?
我将两个类的ID都更改为'com.google.appengine.api.datastore.Key',但不幸的是它仍然无法正常工作。我试图删除持续播放电影的部分,只留下电影对象持续播放的部分,并且由于某种原因电影不会添加到数据库中。 – Elad92 2013-03-09 17:27:35