我继承了一个代码库,几乎所有的关系都有以下注释:
@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing")
@OnDelete(action = OnDeleteAction.CASCADE)
现在我很难理解@OnDelete
的作用。Hibernate: OnDelete vs cascade= cascadtype。REMOVE很有趣,但不幸的是没有任何答案,@OnDelete
的JavaDoc特别没有价值。
从其他问题来看,OnDelete注释在某种程度上让DB进行级联,而@OneToMany
上的级联指令让ORM这样做,但是将它们一起使用的目的是什么?
并且@OneToMany
的级联指令真的不允许ORM实现生成基于DB的级联吗?
假设你有一个一对一的方向关系
class House {
@OneToOne
Object door;
}
如果使用cascadtype。REMOVE则删除房子也会删除门。
@OneToOne(cascade=CascadeType.REMOVE)
Object door;
如果你使用@OnDelete,那么删除门也会删除房子。
@OneToOne
@OnDelete(action = OnDeleteAction.CASCADE)
Object door;
阅读更多:https://rogerkeays.com/jpa-cascadetype-remove-vs-hibernate-ondelete