2011-12-22 184 views
0

我有兩個類應堅持持有對象ID

Movie 
    Collection<Session> sessions; 
Session 
    Movie movie; 

如果定義在電影下面的方法:

addSession() { 
    this.sessions.add(session); 
    session.setMovie(this); 
} 

,然後在會話的方法:

Object movieId; 
setMovie(Movie movie) { 
    this.movieId = movie.getId(); 
} 

我可以保存電影& Session對象,但我得到一個堆棧跟蹤(下)當我嘗試檢索日e動畫與Movie.findById

但是如果我不設置會話上movieId場,那麼我可以成功地檢索擁有電影。

任何想法我可能是做錯了?

 
java.lang.ClassCastException: org.bson.types.ObjectId cannot be cast to com.mongodb.DBObject 
    at com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:136) 
    at com.google.code.morphia.mapping.Mapper.readMappedField(Mapper.java:507) 
    at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:484) 
    at com.google.code.morphia.mapping.ReferenceMapper.resolveObject(ReferenceMapper.java:277) 
    at com.google.code.morphia.mapping.ReferenceMapper.readCollection(ReferenceMapper.java:225) 
    at com.google.code.morphia.mapping.ReferenceMapper.fromDBObject(ReferenceMapper.java:143) 
    at com.google.code.morphia.mapping.Mapper.readMappedField(Mapper.java:505) 
    at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:484) 
    at com.google.code.morphia.mapping.Mapper.fromDBObject(Mapper.java:267) 
    at com.google.code.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:66) 
    at com.google.code.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:53) 
    at com.google.code.morphia.query.MorphiaIterator.next(MorphiaIterator.java:48) 
    at com.google.code.morphia.query.QueryImpl.get(QueryImpl.java:365) 
    at play.modules.morphia.Model$MorphiaQuery._get(Model.java:1045) 
    at models.morphia.Movie.findById(Movie.java) 
    at models.MovieTest.testSave(MovieTest.java:37) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at play.test.PlayJUnitRunner$StartPlay$1$1$1.execute(PlayJUnitRunner.java:73) 
    at play.Invoker$Invocation.run(Invoker.java:265) 
    at play.Invoker.invokeInThread(Invoker.java:67) 
    at play.test.PlayJUnitRunner$StartPlay$1$1.evaluate(PlayJUnitRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at play.test.PlayJUnitRunner.run(PlayJUnitRunner.java:48) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

回答

0

看起來奇怪,你要堅持MoviemovieIdSession

根據您的使用情況,您可能需要制定movieId瞬態或將其聲明爲org.bson.types.ObjectId

+0

好一個感謝 - 拯救id作爲的ObjectId代替對象是招!即使我在調用movie.getIdd()時不得不從Object中強制轉換 - 我想這與它的存儲方式有關係嗎?爲了清晰起見 - 我不保存電影,只有ID。 – Toby 2011-12-22 21:39:04