【发布时间】:2014-01-15 22:31:24
【问题描述】:
当 Hibernate(或其他 JPA 实现)为 @OneToMany 关系创建外键时,有没有办法强制它在数据库级别使用 ON DELETE CASCADE?我发现当我使用 CascadeType.DELETE 时,Hibernate 不会在数据库级别执行此操作,而是发送两个删除语句(用于父记录和子记录)。或者也许有一个很好的理由?
【问题讨论】:
标签: hibernate jpa foreign-keys
当 Hibernate(或其他 JPA 实现)为 @OneToMany 关系创建外键时,有没有办法强制它在数据库级别使用 ON DELETE CASCADE?我发现当我使用 CascadeType.DELETE 时,Hibernate 不会在数据库级别执行此操作,而是发送两个删除语句(用于父记录和子记录)。或者也许有一个很好的理由?
【问题讨论】:
标签: hibernate jpa foreign-keys
在休眠中,你可以使用
@OnDelete(action = OnDeleteAction.CASCADE)
关于你的@OneToMany 关系。这告诉 hibernate 为生成的外键设置 ON DELETE CASCADE。
请注意,这是一个休眠扩展,在 JPA 标准中没有指定。
请谨慎使用。当您让数据库级联删除时,这些操作会在休眠控制之外发生,因此:
我认为你应该只在你有一个大集合并且性能考虑迫使你让数据库处理删除而不是休眠时才使用它。
【讨论】:
它们不是一回事。 JPA Cascade 向下遍历对象图,而数据库外键操作有效地向上遍历对象图。例如,假设您有一对一的定向关系
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
【讨论】: