La suppression orpheline a le même effet que l'opération ON DELETE CASCADE dans le scénario suivant Disons que nous avons une relation simple de plusieurs à un entre l'entité étudiant et l'entité guide, où de nombreux étudiants peuvent être associés au même guide et dans la base de données nous avons une relation de clé étrangère entre la table étudiant et la table guide telle que la table étudiant a id_guide comme FK.
@Entity
@Table(name = "student", catalog = "helloworld")
public class Student implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id")
private Integer id;
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
@JoinColumn(name = "id_guide")
private Guide guide;
// L'entité mère
@Entity
@Table(name = "guide", catalog = "helloworld")
public class Guide implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 9017118664546491038L;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Integer id;
@Column(name = "name", length = 45)
private String name;
@Column(name = "salary", length = 45)
private String salary;
@OneToMany(mappedBy = "guide", orphanRemoval=true)
private Set<Student> students = new HashSet<Student>(0);
Dans ce scénario, la relation est telle que l'entité étudiant est le propriétaire de la relation et en tant que tel, nous devons sauvegarder l'entité étudiant afin de persister le graphe d'objets entier, par exemple.
Guide guide = new Guide("John", "$1500");
Student s1 = new Student(guide, "Roy","ECE");
Student s2 = new Student(guide, "Nick", "ECE");
em.persist(s1);
em.persist(s2);
Ici, nous mappons le même guide avec deux objets étudiants différents et puisque CASCADE.PERSIST est utilisé, le graphique des objets sera enregistré comme ci-dessous dans la table de la base de données (MySql dans mon cas).
Table d'étudiant:-
ID Nom Dépt Id_Guide
1 Roy ECE 1
2 Nick ECE 1
GUIDE Table:-
ID NOM Salaire
1 John $1500
et maintenant si je veux enlever un des étudiants, en utilisant
Student student1 = em.find(Student.class,1);
em.remove(student1);
et lorsqu'un enregistrement d'étudiant est supprimé, l'enregistrement de guide correspondant doit également être supprimé, c'est là que l'attribut CASCADE.REMOVE de l'entité Student entre en jeu et ce qu'il fait est ;il supprime l'étudiant avec l'identifiant 1 ainsi que l'objet guide correspondant (identifiant 1). Mais dans cet exemple, il y a un autre objet étudiant qui est associé au même enregistrement de guide et à moins que nous n'utilisions l'attribut orphanRemoval=true dans l'entité Guide, le code de suppression ci-dessus ne fonctionnera pas.