Pourquoi la fusion n'est pas en cascade sur une relation un à plusieurs
Ma question ici est à peu près semblable à mon autre question Explicite supprimer sur JPA relations
mais j'ai pensé à le simplifier davantage pour justifier des réponses plus détaillées.
Imaginer que j'ai un OneToMany relation entre un parent et un enfant.
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Child> children;
}
@Entity
public class Child {
private String name;
@ManyToOne
private Parent owner;
}
Dans mon INTERFACE, je suis en train de montrer une liste de parent. L'utilisateur peut choisir l'un des parents, et il/elle peut modifier la liste de ses enfants.
Pour montrer cela, j'ai utilisé un currentParent variable pour représenter le parent actuel édité.
L'utilisateur peut choisir d'ajouter/modifier des enfants du nom.
En cliquant sur un bouton, je veux sauver les nouveaux enfants de la liste à l'aide d'un EJB appel.
@ViewScoped
public class MyBean(){
private Parent currentParent;
@EJB
private MyEJB myEJB;
public void saveChanges(){
myEJB.save(currentParent);
}
}
Mon EJB appel ressemble à ceci.
@Stateless
public class MyEJB{
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
public void save(Parent parentNew){
Parent pOld = em.find(entityClass, p.getId());
if(pOld !=null){
pOld.setName(parentNew.getName());
pOld.setChildren(parentNew.getChildren());
em.merge(pOld);
}
}
}
Mon problème est que, je suis capable de changer le nom de la mère, mais tous les changements pour les enfants de la liste n'est pas pris en compte dans la DB.
Elle ne modifie pas, ou d'exécuter du SQL pour supprimer/mettre à jour/ajouter childs.
Ce qui pourrait être la cause?
Mise à JOUR
Bien après quelques essais et erreurs et la lecture par les différents liens, il semble que la définition de la orphanRemoval option dans mon @onetomany, il permettrait de résoudre mon problème. Eclipselink supprime automatiquement l'orphelin lignes au cours de la fusion.
Tellement de JPA complexité..
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval = true)
private List<Child> children;
}
source d'informationauteur Mark Estrada
Vous devez vous connecter pour publier un commentaire.
C'est un problème avec la fusion. Les changements à l'enfant les objets de la collection aura ramassé.
La fusion d'appel ne peut cascade sur les objets qui sont dans la liste, de sorte que les modifications objets qui ne sont pas dans la liste perdu. Malheureusement, la oneToMany n'est pas propre à la relation: l'enfant ManyToOne. De sorte que l'enfant entités doivent être fusionnés pour modifications et poussé à la base de données. Enfant entités sont des objets indépendants et doivent être fusionnés individuellement lorsque le sont modifiées. Que, ou ajouté à un autre parent/arbre pour obtenir fusionné.
Votre question
What could be the cause?
. La cause en est que la teneur en valeurparentNew
. Si leparentNew
est l'un des suivants cause, il n'aura pas d'effet/mise à jour à l'enfant.Parent
paramètre valeur null ou vide liste deClild
--> Ce sera votre cause.Child
n'obtenez pas de mise à jour nom de l'INTERFACE utilisateur.--> Ce sera votre cause.Exemple. J'rapide de l'écrire. Il est OK.
Il existe déjà des données en DB
Après Upldated: