2013-01-11 5 views
0

J'ai deux classes, une référence à l'autre en utilisant @Reference Lors de l'insertion, j'insérerai d'abord la référence et j'insérerai l'objet avec le champ de référence plus tard. Tout fonctionne bien quand je les chercher dans la plupart des time.But parfois, je suis des exceptions commeJ'ai une référence manquante dans mongodb avec morphia

GRAVES: java.lang.RuntimeException: com.google.code.morphia.mapping.MappingException: La référence ({ "ref $": "UserContactLink", "$ id": "50e92481cde5dadc12ff854b"}) ne pouvaient pas être récupérés pour net.shisoft.db.obj.UserContact.ucs

Lorsque j'ai vérifié l'ID dans UserContactLink et il n'y a pas un tel document avec cet id. Je pense que c'est parce que je termine la progression de mongod la dernière fois et la transaction (de mon point de vue) ne s'est pas terminée et la relation de données a été corrompue. Semble mongodb n'ont pas de fonctionnalité de transaction, que puis-je faire avec ce problème?

Répondre

1
  1. Il n'y a pas de transactions. Dans la plupart des cas, vous pouvez restructurer vos documents pour éviter les problèmes (documents d'intégration, ...)

  2. Vous devrez toujours insérer le document référencé en premier. Lors de l'insertion, le serveur MongoDB crée l'ObjectId de l'entité qui est ensuite utilisée dans la référence. Vous voudrez peut-être vérifier l'ID avant de faire référence (vérification simple de null).

+0

Une raison pour laquelle je n'utilise pas de documents incorporés est qu'ils ne peuvent pas être interrogés. Mais merci. – Shisoft

+0

documents intégrés peuvent être interrogés également par dot notatiton réellement. http://docs.mongodb.org/manual/core/read-operations/#read-operations-subdocuments – cubbuk

Questions connexes