JPA OneToMany - la Liste n'est pas mise à jour après ajouter/supprimer un Objet, mais persister dans la DB
J'ai un Problème avec ma Relation comme suit:
(Je suis en utilisant JPA Hibernent pas!)
J'ai un 1:N (Parent de l'Enfant).
Sur une JSP-Site, les Parents et les Enfants sont affichés.
Si je charge la page JSP-Site (la PREMIÈRE FOIS) et Enregistrer un Parent avec un Enfant, tout est ok, le Parent est sauvegardé et l'Enfant est enregistré trop à la bd avec la Clé Étrangère.
Après cela, un deuxième JSP-Site est affiché avec le Parent et les Enfants.
Mais si je reviens pour le premier Site et de gagner un deuxième Enfant (AJOUT de l'ENFANT) à Parent existant, le "childEntityList" est toujours l'ancien, je veux dire, l'Enfant n'est pas dans cette Liste, mais inséré dans la DB!
Pourquoi le "childEntityList" est ancien et n'est pas mise à jour?!
Mes Codes:
Le Parent:
@Entity
@Table(schema = "test", name = "Parent")
@XmlRootElement
@NamedQueries({...})
public class Parent implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "A_SEQ")
@Basic(optional = false)
@NotNull
@Column(name = "ID")
private int id;
@OneToMany(mappedBy = "p", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<ChildEntity> childEntityList = new ArrayList<ChildEntity>();
...
public List<ChildEntity> getChildEntityList() {
return childEntityList;
}
public void setChildEntityList(List<ChildEntity> childEntityList) {
this.childEntityList = childEntityList;
}
public void addChildEntityToParent(ChildEntity c) {
this.childEntityList.add(c);
if(c.getParent() != this) {
c.setParent(this);
}
}
public void removeChildEntityFromParent(ChildEntity c) {
childEntityList.remove(c);
}
...
}
L'Enfant:
@Entity
@Table( name = "Child" )
@NamedQueries({...})
public class ChildEntity implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column( name = "CHILD_ID" )
private Long childId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID")
private Parent p;
...
public Parent getParent() {
return p;
}
public void setParent(Parent p) {
this.p= p;
if(!p.getChildEntityList().contains(this)) {
p.getChildEntityList().add(this);
}
}
Enregistrez-Code:
Parent p = new Parent(...);
ChildEntity c = new ChildEntity(...);
p.addChildEntityToParent(c);
childEntityFacade.create(c);
Vue-Code:
...
public doSomething(Parent p) {
super(p);
}
...
List<ChildEntity> cList = p.getChildEntityList();
System.out.print("Size: " + c.size());
...
Dans la Vue de Code, la taille de la childList est à chaque fois la même chose-je ajouter un Enfant.
Seulement lorsque je redémarre le Serveur, tous les Enfants de la Mère sont affichés!
Quand est ce que les "childEntityList" dans la Classe Parent est-il rempli?
Est-il automatiquement, en raison de la "@OneToMany"?
Quelqu'un peut m'expliquer et m'aider s'il vous plaît?!
Mise à JOUR:
Après la lecture de quelques articles, j'ai peut-être une solution.
Devrais-je fusionner l'EntityManager à chaque fois quand je ajouter/retirer un Enfant de l'Objet à partir de la Liste des Parents ou ai-je faire autre chose?
En ce qui concerne votre problème d'affichage, je vous recommande l'ajout de l'enregistrement enfant à la mère, puis enregistrez le parent. L'enregistrement d'un enfant comme une transaction distincte ne sera pas automatiquement mise à jour des listes déjà instancié parents.
Je n'ai pas bien compris, je pense. Le Parent est existant, et je tiens à ajouter un ou plusieurs Enfants à la Mère. Je le fais avec mes "addChildEntityToParent" dans la Classe Parent. (La fusion problème a été de m'aider)!
Et j'ai mis de l'objet parent sur l'enfant aussi, dans la "addChildEntityToParent", mais après ajout d'un enfant à l' "childEntityList" dans la classe parent. Je pense que c'est correct ou pas?
Vous n'êtes pas la création d'un nouveau dossier à chaque fois que je suppose, où est votre code pour la création d'un nouvel enfant et de l'ajouter à un parent?
OriginalL'auteur user1956764 | 2013-01-08
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour maintenir les deux côtés d'une bi-directionnelle de la relation.
Voir,
http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side
Ce n'childEntityFacade.créer(c)? Quand pensez-vous persister le parent? C'est en créer un nouveau, quel code que vous utilisez pour ajouter un enfant à un parent. Si vous n'fusionner l'enfant, les parents en seront désynchronisés, vous avez besoin de fusionner les deux, ou correctement modifier vos objets gérés.
OriginalL'auteur James
Je suppose que vous vouliez dire que vous n'êtes pas en utilisant l'API Hibernate.
JPA n'est qu'une spécification de l'API de persistance, et, par lui-même, ne fait rien.
Donc, si vous êtes en utilisant JPA... vous êtes à l'aide de quelque chose faire la persistance.
JPA délégués de la persistance du travail à une persistance du moteur tels que Hibernate, EclipseLink, OpenJPA ou quelque chose d'autre.
Vous pouvez configurer votre application pour utiliser JPA interfaces avec un fournisseur de persistance, ou si l'application s'exécute dans un conteneur JEE, puis l'implémentation JPA doivent être fournis pour vous: GlassFish (utilise OpenJPA), WebLogic (utilise EclipseLink), TomEE (utilise OpenJPA).
Vous ne fusionnez pas l'EntityManager; vous pouvez l'utiliser pour fusionner l'entité mère:
Relatives à votre question, lorsque vous utilisez merge() de cette manière... (et parce que la cartographie précise CascadeType.ALL), puis sur le rechargement de la page (le"Site 1"), vous devez obtenir l'actualisation de l'objet parent avec un objet mise à jour réseau contenant des modifications effectuées avant la fusion(parent), y compris tout récemment ajouté des enfants.
OriginalL'auteur J Slick
Oui, vous avez besoin de fusionner entité mère. J'ai eu le même problème et il s'est résolu une fois que j'ai fusionné entité mère.
Aussi vous avez besoin pour maintenir à la fois du côté de la relation.
OriginalL'auteur vivek kumar