JPA的cascade = REMOVE和Hibernate的@OnDelete一起使用?

dex*_*ers 9 java hibernate jpa jpa-2.0

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

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

现在我无法理解@OnDelete首先是什么.Hibernate:OnDelete vs cascade = CascadeType.REMOVE很有意思,但遗憾的是没有任何答案,JavaDoc for @OnDelete也特别没用.

从其他问题来看,OnDelete注释看起来像某种程度上让DB进行级联,而@OneToMany使用ORM 的级联指令可以做到,但是将它们组合在一起的目的是什么?

并且,@OneToManycascade指令真的不允许ORM实现生成基于DB的级联吗?

Rog*_*ays 14

假设你有一对一的方向关系

class House {

    @OneToOne
    Object door;

}
Run Code Online (Sandbox Code Playgroud)

如果您使用CascadeType.REMOVE,则删除房屋也将删除门.

    @OneToOne(cascade=CascadeType.REMOVE)
    Object door;
Run Code Online (Sandbox Code Playgroud)

如果你使用@OnDelete,那么删除门也将删除房子.

    @OneToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    Object door;
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`@ OneToOne`和`@ OneToMany`的行为似乎并不完全相同.使用`@OneToMany(...)@ OnDelete(action = OnDeleteAction.CASCADE)对象门`,似乎删除房子会删除所有门,但删除门不会删除房屋. (2认同)