当Hibernate(或其他JPA实现)为@OneToMany关系创建外键时,有没有办法强制它在数据库级别使用ON DELETE CASCADE?我发现当我使用CascadeType.DELETE时,Hibernate不会在数据库级别执行此操作,而是发送两个delete语句(用于父级和子级记录)。或者也许有充分的理由呢?
答案 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;
如果您使用@OnDelete,那么删除门也将删除房屋。
@OneToOne
@OnDelete(action = OnDeleteAction.CASCADE)
Object door;
在此处阅读更多内容:http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete