私は JDO とその概念が初めてです。以前は非常に単純な ORMLite を使用していましたが、ORMLite で行ったことを JDO で行う方法がわかりません。私は2つのエンティティを持っていBroadcast
ますMovie
. EveryBroadcast
には 1 がMovie
あり、 a には複数の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....
}
これで、DB 内のすべてのデータをフェッチして保存するサーブレットができました。最初に、すべての の映画について、タイトルとその ID しかわかっていないので、すべての をフェッチしBroadcasts
ますBroadcast
。そのため、トランザクションでオブジェクトを含む を保存しBroadcast
ますMovie
(保存されるオブジェクトが 2 つあるため、これはアトミックでなければなりません)。アクション):
// 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 にブロードキャストのクエリを実行していて、それらの中で映画への参照を見つけたいと思っているときはいつでも、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?
それで、私はここで何が間違っていますか?