作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
现在,如果我想从数据库中删除一个 Parent 条目,我会在 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);
但是,如果我想明确选择是级联删除还是简单删除,我该怎么做呢?
我想我不能选择在代码中手动关闭级联注释,那么有没有不使用注释的级联删除的方法?
最佳答案
如果子项与父项有关系,则不应删除父项。这不是什么好办法。在数据库中, child 不应该对 parent 有 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
。
关于java - 使用 JPA CRUD 显式级联删除父级而不使用注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331119/
我是一名优秀的程序员,十分优秀!