Supposons que nous ayons la classe d'objet 3 Entities:
class Parent {
String name;
List<Child> children;
}
class Child {
String name;
Parent parent;
}
class Toy {
String name;
Child child;
}
Comment utiliser les annotations JPA2.x (ou hibernation) pour:
J'utilise Hibernate 4.3.5 et MySQL 5.1.30.
Merci
Comme expliqué dans cet article , la remove
transition d'état de l'entité devrait passer en cascade du parent aux enfants, et non l'inverse.
Vous avez besoin de quelque chose comme ça:
class Parent {
String name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
List<Child> children;
public void addChild(Child child) {
child.setParent(this);
children.add(child);
}
public void removeChild(Child child) {
children.remove(child);
if (child != null) {
child.setParent(null);
}
}
}
class Child {
String name;
@ManyToOne
Parent parent;
@OneToOne(mappedBy = "child", cascade = CascadeType.ALL, orphanRemoval = true)
Toy toy;
}
class Toy {
String name;
@OneToOne
Child child;
}
Vous devriez utiliser CascadeType.REMOVE
. C'est une annotation courante pour Hibernate et JPA. Hibernate a un autre type similaire CacadeType
comme CascadeType.DELETE
.
Supprimer tous les enfants automatiquement lorsque le parent supprime (un à plusieurs)
class Parent {
String name;
@OneToMany(cascade = CascadeType.REMOVE)
List<Child> children;
}
Supprimer l'enfant automatiquement de la liste des enfants quand il est supprimé (plusieurs à un)
class Child {
String name;
@ManyToOne(cascade = CascadeType.REMOVE)
Parent parent;
}
Supprimer le jouet automatiquement lorsque l'enfant enlève (un à un)
class Toy {
String name;
@OneToOne(cascade = CascadeType.REMOVE)
Child child;
}
orphanRemoval is delete all tout exemple d'entité orpheline: magasin (s) a des livres (b1, b2, b3) et b1 a titre (t) dans ce cas si supprimé magasin (s) des livres (b2, b3) seront supprimés. B2 et t existent toujours. si vous utilisez "cascade= CascadeType.Remove
", stockez juste un ou plusieurs livres et tous les livres seront supprimés (seul le "t" existe).
s->b1,b2,b3 b2->t ------after(orphanRemoval = true)--------- b2->t
s->b1,b2,b3 b2->t ------ after(cascade=CascadeType.REMOVE)--------- t
Si orphanRemoval = true est spécifié, l'instance d'entité déconnectée est automatiquement supprimée. Ceci est utile pour nettoyer des objets dépendants qui ne devraient pas exister sans une référence provenant d'un objet propriétaire.
Si seul cascade=CascadeType.REMOVE
est spécifié, aucune action automatique n'est entreprise car la déconnexion d'une relation n'est pas une opération de suppression.