J'ai un problème avec un simple @OneToMany
mappage entre un parent et une entité enfant. Tout fonctionne bien, seuls les enregistrements enfants ne sont pas supprimés lorsque je les supprime de la collection.
Le parent:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
L'enfant:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
Si je supprime maintenant un enfant de l'ensemble childs, il n'est pas supprimé de la base de données. J'ai essayé d'annuler la child.parent
référence, mais cela n'a pas fonctionné non plus.
Les entités sont utilisées dans une application web, la suppression intervient dans le cadre d'une requête Ajax. Je n'ai pas de liste d'enfants supprimés lorsque le bouton Enregistrer est enfoncé, je ne peux donc pas les supprimer implicitement.
En plus de la réponse de cletus, JPA 2.0 , définitif depuis décembre 2010, introduit un
orphanRemoval
attribut sur les@OneToMany
annotations. Pour plus de détails, consultez cette entrée de blog .Notez que puisque la spécification est relativement nouvelle, tous les fournisseurs JPA 1 n'ont pas une implémentation finale de JPA 2. Par exemple, la version Hibernate 3.5.0-Beta-2 ne prend pas encore en charge cet attribut.
la source
Vous pouvez essayer ceci:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
.la source
Comme expliqué, il n'est pas possible de faire ce que je veux avec JPA, j'ai donc utilisé l'annotation hibernate.cascade, avec ceci, le code correspondant dans la classe Parent ressemble maintenant à ceci:
Je ne pouvais pas simplement utiliser «TOUS» car cela aurait également supprimé le parent.
la source
Ici, la cascade, dans le contexte de remove, signifie que les enfants sont supprimés si vous supprimez le parent. Pas l'association. Si vous utilisez Hibernate comme fournisseur JPA, vous pouvez le faire en utilisant une cascade spécifique à Hibernate .
la source
Vous pouvez essayer ceci:
ou
la source
Regardez ici .
la source