JPA Persister le parent et l'enfant avec l'un de relation
Je veux persister entité mère avec 20 enfants,
mon code est ci-dessous
Classe Parent
@OneToMany(mappedBy = "parentId")
private Collection<Child> childCollection;
Enfant De La Classe
@JoinColumn(name = "parent_id", referencedColumnName = "parent_id")
@ManyToOne(optional=false)
private Parent parent;
String jsonString = "json string containing parent properties and child collection"
ObjectMapper mapper = new ObjectMapper();
Parent parent = mapper.readValue(jsonString, Parent.class);
public void save(Parent parent) {
Collection<Child> childCollection = new ArrayList<>() ;
for(Child tha : parent.getChildCollection()) {
tha.setParent(parent);
childCollection.add(tha);
}
parent.setChildCollection(childCollection);
getEntityManager().persist(parent);
}
Donc si il y a 20 tables enfants alors je dois mettre le parent de référence dans chacun d'eux pour ce que j'ai à écrire 20 pour les boucles?
Est-il possible? est-il un autre moyen ou une configuration où je peux automatiquement persister le parent et l'enfant?
Cela semble de plus d'un JSON question que JPA question. Si votre JSON est unmarshalled de sorte que les relations sont définies, puis d'avoir les enfants ont persisté lors de l'enregistrement parent est simplement une question de l'ajout de la pertinente cascade d'options pour le @OneToMany (en supposant que votre mappages sont corrects)
Si vous n'êtes pas envoyer l'Enfant->relation Parent en arrière, ou il n'est pas défini dans ce qui se construit à partir de JSON, alors oui, vous devez le paramétrer manuellement dans chaque entité enfant. L'alternative est de faire de la relation d'uni-directionnelle: supprimer le mappedby="parent" de la OneToMany et, au lieu de spécifier un JoinColumn. Ce sera la cause de la OneToMany pour définir la clé étrangère dans la table enfant au lieu de l'être par la référence de l'enfant à son parent (ensuite, vous devez supprimer le parent de l'Enfant de l'attribut et de la cartographie)
Si vous n'êtes pas envoyer l'Enfant->relation Parent en arrière, ou il n'est pas défini dans ce qui se construit à partir de JSON, alors oui, vous devez le paramétrer manuellement dans chaque entité enfant. L'alternative est de faire de la relation d'uni-directionnelle: supprimer le mappedby="parent" de la OneToMany et, au lieu de spécifier un JoinColumn. Ce sera la cause de la OneToMany pour définir la clé étrangère dans la table enfant au lieu de l'être par la référence de l'enfant à son parent (ensuite, vous devez supprimer le parent de l'Enfant de l'attribut et de la cartographie)
OriginalL'auteur Gora | 2016-02-04
Vous devez vous connecter pour publier un commentaire.
Fixer votre classe Parent:
mappedBy propriété doit pointer vers le terrain de l'autre côté de la relation. Comme JavaDoc dit:
Aussi, vous devez explicitement persistent entité Enfant dans le cycle:
Comme Alan Foin remarqué dans un commentaire, vous pouvez utiliser cascade d'installations et de laisser l'EntityManager automatiquement persistent tout votre Enfant entités:
Plus de détails à propos de cascades (et JPA lui-même) que vous pouvez trouver dans Vlad Mihalcea blog.
mais pour 20 différent de l'enfant collections, je vais avoir à écrire de 20 pour les boucles?
Reddy, je pense que oui, cos de 20 différent de l'enfant collections est de 20 différents objets Parents et vous permettra d'appeler la méthode save(...) 20 fois.
J'ai mis à jour ma réponse.
j'avais utilisé cascade = CascadeType.PERSISTER, mais je suis étrangers ont à clé null
OriginalL'auteur Ivan Babanin
Généralement, les annotations @JoinColumn indique que l'entité est le propriétaire de la relation & mappedBy indique que l'entité est le inverse de la relation.
Donc, si vous êtes comme suit
Qui signifie qu'il est inverse de la relation et il ne sera pas mis en référence du parent à son enfant.
Pour définir la référence du parent à son enfant, vous devez vous rendre cette entité propriétaire de la relation de la manière suivante.
Vous n'avez pas besoin de définir toute de référence de l'enfant parce que le code ci-dessus va créer une colonne dans la table enfant.
Unidirectional @OneToMany
et puis, Hibernate va créer deux fois plus de requêtes SQL DB vladmihalcea.com/2017/03/29/...OriginalL'auteur maruf571
Je laisserais le parent persister propres enfants
FetchType.EAGER
nécessaire dans le cas où nous voulons seulement le parent pour conserver les enfants ?non, je pense que je l'ai fait pour des raisons de test
OriginalL'auteur Essex Boy
Comme l'a souligné dans les commentaires, vous devez prendre soin de l'objet graphique en cohérence avec l'enfant/relation parent. Cette cohérence ne viendra pas libre quand JSON est venue directement à partir de c'est à dire une requête POST.
Vous devez annoter le parent et l'enfant de terrain avec
@JsonBackReference
et@JsonManagedReference
.Classe Parent:
Enfant de la classe:
Même question avec réponse est ici
En outre, si vous utilisez
@JsonBackReference
/@JsonManagedReference
surjavax.persistence
annoté classes en combinaison avec de Lombok@ToString
annotation que vous devrez engager dans stackoverflow erreur.Juste exclure
childCollection
etparent
champ de la@ToString
annotation avec@ToString( exclude = ...)
La même chose se produira avec Lombok est généré
equals()
méthode (@Data
,@EqualsAndHashCode
). Juste implémente ces méthodes à la main ou à l'utilisation@Getter
et@Setter
annotations.OriginalL'auteur s17t.net