Disons que j'ai une relation unidirectionnelle @ManyToOne
comme celle-ci:
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
}
@Entity
public class Child implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumn
private Parent parent;
}
Si j'ai un parent P et des enfants C 1 ... C n renvoyant à P, y a-t-il un moyen propre et joli dans JPA de supprimer automatiquement les enfants C 1 ... C n lorsque P est supprimé (ie entityManager.remove(P)
)?
Ce que je recherche, c'est une fonctionnalité similaire à ON DELETE CASCADE
SQL.
java
jpa
jpa-2.0
many-to-one
perp
la source
la source
Réponses:
Les relations dans JPA sont toujours unidirectionnelles, sauf si vous associez le parent à l'enfant dans les deux sens. Les opérations REMOVE en cascade du parent vers l'enfant nécessiteront une relation entre le parent et l'enfant (pas seulement l'inverse).
Vous devrez donc faire ceci:
@ManyToOne
relation unidirectionnelle en une relation bidirectionnelle@ManyToOne
ou unidirectionnelle@OneToMany
. Vous pouvez ensuite mettre en cascade les opérations REMOVE afin deEntityManager.remove
supprimer le parent et les enfants. Vous pouvez également spécifierorphanRemoval
comme vrai, pour supprimer tous les enfants orphelins lorsque l'entité enfant de la collection parent est définie sur null, c'est-à-dire supprimer l'enfant lorsqu'il n'est présent dans aucune collection parent.ON DELETE CASCADE
. Vous devrez appelerEntityManager.clear()
après l'appelEntityManager.remove(parent)
car le contexte de persistance doit être actualisé - les entités enfants ne sont pas censées exister dans le contexte de persistance après avoir été supprimées dans la base de données.la source
Si vous utilisez hibernate comme fournisseur JPA, vous pouvez utiliser l'annotation @OnDelete. Cette annotation ajoutera à la relation le déclencheur ON DELETE CASCADE , qui délègue la suppression des enfants à la base de données.
Exemple:
Avec cette solution, une relation unidirectionnelle de l'enfant au parent suffit pour supprimer automatiquement tous les enfants. Cette solution ne nécessite aucun écouteur, etc. Une requête telle que DELETE FROM Parent WHERE id = 1 supprimera les enfants.
la source
@OneToOne
Des idées avec comment le résoudre@OneToOne
?Créez une relation bidirectionnelle, comme ceci:
la source
J'ai vu dans @ManytoOne unidirectionnel, supprimer ne fonctionne pas comme prévu. Lorsque le parent est supprimé, idéalement l'enfant devrait également être supprimé, mais seul le parent est supprimé et l'enfant n'est PAS supprimé et reste orphelin
Les technologies utilisées sont Spring Boot / Spring Data JPA / Hibernate
Démarrage du sprint: 2.1.2.RELEASE
Spring Data JPA / Hibernate est utilisé pour supprimer la ligne .eg
parentRepository.delete(parent)
ParentRepository étend le référentiel CRUD standard comme indiqué ci-dessous
ParentRepository extends CrudRepository<T, ID>
Voici ma classe d'entité
la source
spring.jpa.hibernate.use-new-id-generator-mappings=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
"
dans le code. Voirname= "parent"
Utilisez cette méthode pour supprimer un seul côté
la source
@Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Étant donné l'annotation a fonctionné pour moi. Peut avoir un essai
Par exemple :-
la source