2017-09-27 12 views
0

J'ai une relation de un à plusieurs, à savoir A et B. A peut faire référence à de nombreuses instances B. Les instances B peuvent également être gérées indépendamment. Voilà pourquoi, la classe B ressemble à ceci:Spring Data Couchbase a mis l'attribut @Id à json lorsqu'il a été intégré

public class B { 
    @Id 
    private String id; 
    private String appId; 
} 

Une classe fera référence à la liste des instances B. Donc, il ressemble à ceci:

public class A { 
    @Id 
    private String id; 
    private int age; 
    private List<B> bInstances; 
} 

Lorsque bInstances sont remplis avec des instances B et une instance est enregistrée, les champs d'identification des instances B sont retirées du document JSON puisqu'il est annotées avec @Id. J'ai simplement besoin d'ajouter ce champ à JSON lorsque B est intégré dans une autre classe. Et lorsque l'instance B est sauvegardée indépendamment, le champ @Id peut être utilisé comme clé normale. Comment puis-je faire cela?

Répondre

0

Pour répondre précisément à votre question, oui le champ annoté @Id ne sera pas écrit au JSON sérialisé. Votre meilleur pari ici est de dupliquer le champ et définissez sa valeur dans le constructeur ou un poseur, par exemple:

public class B { 
@Id 
private String metaId; 
private String id; 
private String appId; 

public setMetaId(String metaId) { 
    this.metaId = metaId; 
    this.id = metaId; 
} 
} 

Vous pouvez @JsonIgnore un d'entre eux si vous ne voulez pas voir la duplication dans vos sérialisations .

Note: Je suis entièrement d'accord avec la réponse de Robin, mais il y a des cas où vous voulez enregistrer les données telles quelles et vous voulez vous y reporter dans le futur .. donc vous ne vous souciez pas si l'instance B changé une semaine après avoir enregistré les données. Cela dépend donc vraiment de votre scénario.

0

pas stocker les instances de B directement dans un document de A. Cela entraînerait des incohérences de données si une instance de B est modifiée dans un autre contexte que A. De plus, vous dupliquez des données inutilement si une instance de B est stockée dans plusieurs documents de classe A.

La méthode souhaitée pour stocker des instances d'une classe dans une autre consiste à enregistrer les ID de document à la place. Ainsi, votre classe A devrait ressembler à ceci:

public class A { 
    @Id 
    private String id; 
    private int age; 
    private List<String> bInstanceIds; 
} 
+0

Et puis quoi? Créer le passe-partout vous-même pour récupérer les sous-documents par ID? Donc, il n'y a pas d'annotation relationnelle utilisable comme '@ ManyToMany'? Ou '@ DBRef' dans MongoDb –