私は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番目のコメントを追加しようとすると失敗します。 アイデアありがとう。
NPEが 'IncomingProcessor.processIncomingJson(IncomingProcessor.java:78)'にありません。また、 'jsonObject.getString(" owner ")'は私には奇妙に見える - モルフィアは自動的にそれを処理する必要があります。メンバー変数を手動でマップする必要はありません。 – xeraa