【问题标题】:JPA's cascade = REMOVE and Hibernate's @OnDelete used together?JPA 的 cascade = REMOVE 和 Hibernate 的 @OnDelete 一起使用?
【发布时间】:2012-01-23 17:12:07
【问题描述】:

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

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

现在我无法理解 @OnDelete 首先做了什么。 Hibernate: OnDelete vs cascade=CascadeType.REMOVE 很有趣,但不幸的是没有任何答案,@OnDelete 的 JavaDoc 特别没有价值。

从其他问题看来,OnDelete 注释以某种方式让 DB 执行级联,而 @OneToMany 上的级联指令让 ORM 执行此操作,但将它们一起使用的目的是什么?

@OneToMany 的 cascade 指令真的不允许 ORM 实现生成基于 DB 的级联吗?

【问题讨论】:

    标签: java hibernate jpa jpa-2.0


    【解决方案1】:

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

    class House {
    
        @OneToOne
        Object door;
    
    }
    

    如果你使用 CascadeType.REMOVE,那么删除房子也会删除门。

        @OneToOne(cascade=CascadeType.REMOVE)
        Object door;
    

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

        @OneToOne
        @OnDelete(action = OnDeleteAction.CASCADE)
        Object door;
    

    在此处阅读更多信息:https://rogerkeays.com/jpa-cascadetype-remove-vs-hibernate-ondelete

    【讨论】:

    • @OneToOne@OneToMany 的行为似乎不太一样。使用@OneToMany(...) @OnDelete(action = OnDeleteAction.CASCADE) Object doors,似乎删除房子会删除所有门,但删除门不会删除房子。
    • 我想应该是@OneToMany List<Object> doors。但除此之外,此映射通常不会在 House 表上创建列。您要么在Doors.house 上进行反向映射,要么在集合表上进行映射。对于数据库级联,我认为列必须在您要级联到的表中。
    • 不同意。我认为CascadeType.REMOVE@OnDelete在用户看来最大的区别在于@OnDelete可以和JPAQL一起工作(因为它是基于DB级联的),但是CascadeType.REMOVE不能和JPAQL一起工作。
    • '@OnDelete 的目的是通过数据库外键约束委托删除相关对象。你可以通过使用@Cascade ragarding 来实现同样的目标
    猜你喜欢
    • 2017-03-10
    • 2016-06-12
    • 2015-03-25
    • 2019-12-30
    • 2012-09-09
    • 2014-09-13
    • 1970-01-01
    • 2021-01-08
    相关资源
    最近更新 更多