удаление сирот имеет тот же эффект, что и ON DELETE CASCADE в следующем сценарии: -
Допустим, у нас есть простое отношение много-к-одному между сущностью студента и сущностью-гидом, где многие ученики могут быть сопоставлены с одним и тем же руководством, а в базе данных у нас есть связь по внешнему ключу между таблицей ученика и путеводителем, так что в таблице ученика есть id_guide как 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;
// Родительский объект
@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);
В этом сценарии взаимосвязь такова, что объект учащегося является владельцем отношения, и поэтому нам необходимо сохранить объект учащегося, чтобы сохранить весь граф объектов, например,
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);
Здесь мы отображаем одно и то же руководство с двумя разными объектами учащихся, и поскольку используется CASCADE.PERSIST, граф объектов будет сохранен, как показано ниже в таблице базы данных (в моем случае MySql)
Стол СТУДЕНТА: -
ID Name Dept Id_Guide
1 Roy ECE 1
2 ник ECE 1
Таблица руководств: -
ID NAME Зарплата
1 Джон $ 1500
и теперь, если я хочу удалить одного из студентов, используйте
Student student1 = em.find(Student.class,1);
em.remove(student1);
и при удалении записи об ученике должна быть также удалена соответствующая запись гида, вот где атрибут CASCADE.REMOVE в сущности «Студент» входит в картинку и что он делает, он удаляет студента с идентификатором 1, а также соответствующее руководство объект (идентификатор 1). Но в этом примере есть еще один объект ученика, который сопоставлен с той же направляющей записью, и, если мы не используем атрибут orphanRemoval = true в объекте Guide, приведенный выше код удаления не будет работать.