我是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