2017-05-01 3 views
0

私はMongoDbとMorphiaを使って私のアプリケーションのバックエンドを書いていますが、埋め込みオブジェクトを保存すると面白い問題に遭遇しました。Morphia最初の検索ではなく、2番目の検索でNullを返すクエリ?

フォーラムソフトウェアを作成しています。投稿(親オブジェクト)とコメント(子オブジェクト)があります。各投稿にはコメントのArrayListが含まれています。私は投稿を作成し、それに1つのコメントを追加することができます。それはうまく動作します。 2番目のコメントを追加しようとすると、コメントを添付する投稿を検索するときにモルフィアクエリがnullオブジェクトを返すように見えます。ここで

は私のprocessCommentメソッド内部にあるコードは、次のとおりです。

// Get Owner and ParentObjectId from the incoming JSONObject. 
     String commentOwner = jsonObject.getString("owner"); 
     String parentObjectUuid = jsonObject.getString("parentObjectUuid"); 

     // Create a new Comment from these values, and add the body. 
     Comment comment = new Comment(commentOwner, parentObjectUuid); 
     comment.setBody(jsonObject.getString("body")); 

     // Get Parent Object from Datastore. 
     Query<Post> query = datastore.createQuery(Post.class); 
     query.field("uuid").equalIgnoreCase(parentObjectUuid); 
     Post parentObject = query.get(); // <--- This is Line #144 where I think it fails. 

     // Add comment to its ParentObject, and save in our datastore. 
     parentObject.addComment(comment); 
     datastore.save(parentObject); 


Here is the stacktrace: 
java.lang.RuntimeException: java.lang.NullPointerException 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:76) 
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:850) 
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:282) 
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:193) 
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:134) 
    at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:146) 
    at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:117) 
    at org.mongodb.morphia.query.QueryImpl.get(QueryImpl.java:236) 
    at org.mongodb.morphia.query.QueryImpl.get(QueryImpl.java:227) 
    at IncomingProcessor.processComment(IncomingProcessor.java:144) 
    at IncomingProcessor.processIncomingJson(IncomingProcessor.java:78) 
    at IncomingProcessor.<init>(IncomingProcessor.java:50) 
    at Main.main(Main.java:78) 
Caused by: java.lang.NullPointerException 
    at org.mongodb.morphia.Key.hashCode(Key.java:149) 
    at java.util.HashMap.hash(HashMap.java:338) 
    at java.util.HashMap.put(HashMap.java:611) 
    at org.mongodb.morphia.mapping.cache.DefaultEntityCache.notifyExists(DefaultEntityCache.java:82) 
    at org.mongodb.morphia.mapping.cache.DefaultEntityCache.putEntity(DefaultEntityCache.java:90) 
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:293) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.readMapOrCollectionOrEntity(EmbeddedMapper.java:210) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.readCollection(EmbeddedMapper.java:144) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:47) 
    ... 12 more 

だけ明確にするために、このコードは最初の時間を動作します。 2番目のコメントを追加しようとすると失敗します。 アイデアありがとう。

+0

NPEが 'IncomingProcessor.processIncomingJson(IncomingProcessor.java:78)'にありません。また、 'jsonObject.getString(" owner ")'は私には奇妙に見える - モルフィアは自動的にそれを処理する必要があります。メンバー変数を手動でマップする必要はありません。 – xeraa

答えて

0

MorphiaはObject全体を保存し直していたため、MongoDBがObjectの識別に使用する内部ハッシュコードが変更されました。問題を解決したコードは次のとおりです。

// This gets the Post parent object from the DB. 
Query<Post> query = datastore.createQuery(Post.class).field("uuid").equal(objectUuid); 

// This save the newComment to an ArrayList<Comment> called commentsList. 
datastore.update(query, datastore.createUpdateOperations(Post.class).push("commentsList", newComment)); 

これは私を夢中にしてくれました。私は間違っていたdatastore.save()メソッドを使用していました。 .push()メソッドを使用してCreateUpdateOperationsでdatastore.update()メソッドを使用する必要がありました。

ここには多くの呪いがありました。私はモルフィアが好きか分からない。

関連する問題