2014-04-29 6 views
4

Il y a un objet POJO un classique comme ci-dessous:données MongoDB printemps ne peuvent pas chercher @DBRef objets avec "trouver" requête

@Document 
public class MyPojo { 
    @DBRef 
    @Field("otherPojo") 
    private List<OtherPojo> otherPojos; 
} 

Et OtherPojo.java:

public class OtherPojo{ 
    @Id 
    private ObjectId _id; 
    private String someOtherFields; 
} 

Je ne peux pas en cascade sauver ceux-ci, mais je m'en remets en sauvant d'abord DBRefs puis en sauvegardant ma liste POJO, mais quand j'essaie d'aller chercher toute la liste ou d'en interroger quelques-uns avec le code ci-dessous:

Query query = new Query(Criteria.where("myPojo.blabla").is("blabla")); 
List<MyPojo> resultList = mongoTemplate.find(query, MyPojo.class, "myCollection"); 

il me renvoie une liste de null DBrefs, il compte vrai. Par exemple: il y a 10 DBRefs sauvés, il renvoie 10 objets NULL, mais ses types primitifs et d'autres types qui ne sont pas un DBRref sont tous non-null. Comment puis-je gérer cela?

enregistrer mes objets comme ci-dessous:

for (MyPojo pojo : somePojoList) { 
    for (OtherPojo otherPojo : pojo.getOtherPojos()) { 
     mongoTemplate.save(otherPojo, "myCollection"); 
    } 
} 

// ... 

mongoTemplate.insert(myPojoList, "myCollection"); 

EDIT: OK, maintenant je sais que si je ne spécifie pas un nom de collection quand je sauve otherPojos, je peux les fetch (grâce à @ jmen7070). Mais je dois écrire myCollection parce que je les laisse tomber et les recréer toujours. C'est un cas d'utilisation. Alors, comment puis-je dire "trouver la méthode pour utiliser la même collection pour récupérer DBRefs"?

+0

Pouvez-vous donner plus de détails sur comment sauvegarder les objets dans la base de données? – jmen7070

+0

a mis à jour ma question .. –

Répondre

2

Comme vous pouvez le voir docs:

Le framework de mapping ne gère pas en cascade permet d'économiser. Si vous modifiez un objet de compte référencé par un objet Personne, vous devez enregistrer séparément l'objet Compte . Appeler save sur l'objet Person n'enregistre pas automatiquement les objets Account dans les comptes de propriété.

Donc, tout d'abord, vous devez enregistrer chaque objet de l'autre liste de port. Après cela, vous pouvez enregistrer par exemple MyPojo:

MyPojo pojo = new MyPojo(); 
OtherPojo otherPojo = new OtherPojo(); 
OtherPojo otherPojo1 = new OtherPojo(); 

pojo.setOtherPojos(Arrays.asList(otherPojo, otherPojo1)); 

mongoTemplate.save(otherPojo); 
mongoTemplate.save(otherPojo1); 

mongoTemplate.save(pojo); 

MISE À JOUR: Vous avez sauvé des objets:

for(MyPojo pojo : somePojoList){ 
      for(OtherPojo otherPojo : pojo.getOtherPojos()){ 
       mongoTemplate.save(otherPojo,collectionname); 
      } 
     } 

Tous les objets otherPojo seront enregistrés dans la collection avec le nom "collectionName" ..

mais vos objets myPojo ont un $ ref à une autre collection Pjojo.

"otherPojo" : [ 
     { 
      "$ref" : "otherPojo", 
      "$id" : ObjectId("535f9100ad52e59815755cef") 
     }, 
     { 
      "$ref" : "otherPojo", 
      "$id" : ObjectId("535f9101ad52e59815755cf0") 
     } 
    ] 

Ainsi, "collectionname" Variable

mongoTemplate.save(otherPojo,collectionname); 

doit être "otherPojo".

Pour éviter toute confusion, je vous propose de spécifier une collection pour la sauvegarde des objets OtherPojo avec l'annotation @Doucument:

@Document(collection="otherPojos") 
public class OtherPojo{ 

@Id 
private ObjectId _id; 
private String someOtherFields; 

} 

Et pour sauver des objets otherPojo en utilisant une méthode de mongoTemplate

mongoTemplate.save(otherPojo); 
surchargé save()

de cette façon, vous aurez une ref $ valable pour les documents myPojo

MISE à JOUR 2:

Dans ce cas, vous souhaitez stocker les objets parents et enfants dans la même collection.

Pour ce faire, vous pouvez utiliser this approach

+0

no !! 'ok, maintenant je ne peux pas les sauvegarder en cascade mais je m'en remets en enregistrant d'abord DBRefs puis en sauvegardant ma liste de pojo, mais quand j'essaye d'aller chercher toutes les listes ou de les interroger avec le code ci-dessous: ' –

+0

ok, j'ai suivi vos suggestions, je les récupère avec succès maintenant, mais je dois spécifier un nom de collection .. Je peux lui donner un nom de collection différent résout-il? –

+0

Je ne comprends pas votre dernière question, désolé) Quel est votre objectif? Quelles collections voulez-vous enregistrer des objets? – jmen7070

Questions connexes