web-dev-qa-db-fra.com

Spring Mongodb @DBREF

Ceci est ma structure MongoDb,

db.user.find();

utilisateur:

{
"name" : "KSK", 
 "claim"  : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")] 
}

prétendre:

[
   {
     "_id" : "52ffc4a5d85242602e000001",
     "claimName" :"XXXX"
   },
   {
     "_id" : "52ffc4a5d85242602e000000",
     "claimName" :"YYY"
   }
]

Ma classe d'entité est:

@Document(collection="user")
public  class User{
  @Id      
  private String id;
  private String name; 
  @DBRef
private List<Claim> claim; 
// setter and getter 

}

Classe de réclamation:

@Document(collection="Claim")
public class Claim{
   @Id 
   private String id; 
   private String claimName;   
}

J'ai une méthode pour obtenir les utilisateurs par nom comme ci-dessous,

public User findByName(String name);

Si j'essaie de frapper cette méthode, j'obtiens une erreur qui,

Aucun convertisseur trouvé capable de convertir du type org.bson.types.ObjectId en type Java.lang.String

J'ai donc changé ma classe d'entité utilisateur comme ci-dessous,

Au lieu de private List<Claim> claim;

Modifié en Private List<ObjectId> claim;

Maintenant, si j'exécute une méthode (findByName), j'obtiens un objet utilisateur qui a les deux identifiants d'objet de revendication ("52ffc4a5d85242602e000001", "52ffc4a5d85242602e000000"), puis itérez la liste des revendications et obtenez les détails de la revendication correspondant à l'ID d'objet de revendication.

Au lieu de faire cela, lorsque j'exécute la méthode findByName, je veux obtenir un utilisateur et revendiquer les détails. Comment puis-je obtenir cette fonctionnalité

9
KSK

Si vous référencez vos Claim dans la classe User avec @DBRef, votre JSON ne doit pas seulement contenir l'ID mais la référence à la collection où trouver l'ID également, comme ceci:

{
  "name" : "KSK", 
  "claim"  : [ 
     { "$ref":"claim", // the target collection
       "$id : "ObjectId("52ffc4a5d85242602e000000")
     }
  ] 
}

Voilà comment Spring-Data mappe vos objets Java à MongoDB. Si vous commencez avec une base de données vierge et laissez Spring créer et enregistrer les relations, vous ne devriez avoir aucun problème à utiliser

 @DBRef List<Claim> claims;
4
Matt

Ma suggestion n'est pas de définir cette classe de réclamation dans un @Document distinct ou de revenir simplement aux bases de données relationnelles, car ce n'est pas une approche Mongo. De plus, si vous insistez sur l'architecture actuelle, vous pouvez essayer d'utiliser @DBRef au-dessus de cette liste dans User.class dans smth comme ceci:

public class ParentModel {

    @Id
    private String id;

    private String name;

    private ParentType parentType;

    private SubType subType;

    @DBRef
    private List<Model> models;

....
}
2
Andrew Petryk