强制Hibernate使用ON DELETE CASCADE创建外键

时间:2014-01-15 22:31:25

标签: hibernate jpa foreign-keys

当Hibernate(或其他JPA实现)为@OneToMany关系创建外键时,有没有办法强制它在数据库级别使用ON DELETE CASCADE?我发现当我使用CascadeType.DELETE时,Hibernate不会在数据库级别执行此操作,而是发送两个delete语句(用于父级和子级记录)。或者也许有充分的理由呢?

2 个答案:

答案 0 :(得分:2)

在休眠状态下,您可以使用

@OnDelete(action = OnDeleteAction.CASCADE)

关于你的@OneToMany关系。这告诉hibernate为生成的外键设置ON DELETE CASCADE。

请注意,这是一个hibernate扩展,并未在JPA标准中指定。

请谨慎使用。当你让数据库级联删除时,这些都发生在hibernate的控制之外,所以:

  • 您的二级缓存可能会不同步。
  • 您无法在这些实体上使用删除侦听器。

我认为你应该只使用这个,如果你有一个大的集合,性能考虑迫使你让数据库处理删除而不是休眠。

答案 1 :(得分:0)

他们不是一回事。 JPA Cascade遍历DOWN对象图,而数据库外键操作有效地遍历对象图。例如,让我们说你有一对一的方向关系

class House {

    @OneToOne
    Object door;

}

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

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

如果您使用@O​​nDelete,那么删除门也将删除房屋。

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

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