我继承了一个几乎所有关系都具有以下注释的代码库:

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing")
@OnDelete(action = OnDeleteAction.CASCADE)

现在,我一开始就无法理解@OnDelete的功能。 Hibernate: OnDelete vs cascade=CascadeType.REMOVE很有趣,但是不幸的是没有任何答案,而且@OnDelete的JavaDoc毫无值(value)。

从其他问题来看,看起来OnDelete批注以某种方式可以使DB进行级联,而@OneToMany上的cascading指令则可以由ORM进行级联,但是将它们一起使用的目的是什么?
@OneToMany的级联指令是否真的不允许ORM实现生成基于数据库的级联吗?

最佳答案

假设您有一对一的定向关系

class House {

    @OneToOne
    Object door;

}

如果使用CascadeType.REMOVE,则删除房屋也将删除门。
    @OneToOne(cascade=CascadeType.REMOVE)
    Object door;

如果使用@OnDelete,则删除门也将删除房屋。
    @OneToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    Object door;

在这里阅读更多:http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete

07-26 05:15