现在,如果我想从数据库中删除父条目,我会在Parent类中使用级联注释,因此删除Parent也会删除与之关联的所有子级。像这样:
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private Set<Child> children;
}
@Entity
public class Child implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumn
private Parent parent;
}
实际的删除是这样的:
this.parentRepository.delete(parentID);
但是,如果我想明确选择是否级联删除或简单删除,我该怎么做?
我不认为我可以选择手动关闭代码中的级联注释,那么有没有一种方法可以在不使用注释的情况下级联删除?
答案 0 :(得分:1)
如果孩子与父母有关系,则不应删除父母。这不是好方法。在db中,child不应该对父
有notNull
限制
但你真的想要控制级联删除,我建议使用@EntityListeners
:
@EntityListeners({ParentJpaCallbacksListener.class})
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy = "parent")
private Set<Child> children;
}
,其中
@Component
public class ParentJpaCallbacksListener {
@Autoware ChildRepository childRepository;
@PreRemove
// or @PostRemove
void preRemove(Parent parent) {
// your cascade deletion logic
// for example use childRepository to delete some children
}
}
这样你就不应该cascade = CascadeType.REMOVE
。