强制Hibernate使用ON DELETE CASCADE创建外键
当Hibernate(或另一个JPA实现)为@OneToMany关系创建外键时,有没有办法强制它在数据库级别的删除级联上使用?我发现,当我使用CascadeType.DELETE时,Hibernate不会在数据库级别执行此操作,而是发送两条DELETE语句(用于父记录和子记录)。或者可能有一个很好的理由?在hibernate中,您可以使用强制Hibernate使用ON DELETE CASCADE创建外键,hibernate,jpa,foreign-keys,Hibernate,Jpa,Foreign Keys,当Hibernate(或另一个JPA实现)为@OneToMany关系创建外键时,有没有办法强制它在数据库级别的删除级联上使用?我发现,当我使用CascadeType.DELETE时,Hibernate不会在数据库级别执行此操作,而是发送两条DELETE语句(用于父记录和子记录)。或者可能有一个很好的理由?在hibernate中,您可以使用 @OnDelete(action = OnDeleteAction.CASCADE) 关于你的“一对一”关系。这告诉hibernate为生成的外键设置DEL
@OnDelete(action = OnDeleteAction.CASCADE)
关于你的“一对一”关系。这告诉hibernate为生成的外键设置DELETE CASCADE
请注意,这是一个hibernate扩展,在JPA标准中没有指定
小心使用。当您让数据库级联删除时,这些删除在hibernate的控制之外发生,因此:
- 您的二级缓存可能不同步
- 不能在删除这些实体上的侦听器时使用
我认为只有当您有大量的集合,并且性能考虑迫使您让数据库处理删除而不是hibernate时,才应该使用此选项。在hibernate中,您可以使用
@OnDelete(action = OnDeleteAction.CASCADE)
关于你的“一对一”关系。这告诉hibernate为生成的外键设置DELETE CASCADE
请注意,这是一个hibernate扩展,在JPA标准中没有指定
小心使用。当您让数据库级联删除时,这些删除在hibernate的控制之外发生,因此:
- 您的二级缓存可能不同步
- 不能在删除这些实体上的侦听器时使用
我认为只有当您拥有大量的集合时才应该使用此选项,并且性能考虑迫使您让数据库处理删除而不是休眠。它们不是一回事。JPA级联向下遍历对象图,而数据库外键操作有效地向上遍历对象图。例如,假设您有一对一的方向关系
class House {
@OneToOne
Object door;
}
如果使用CascadeType.REMOVE,则删除房屋也将删除门
@OneToOne(cascade=CascadeType.REMOVE)
Object door;
如果您使用@OnDelete,那么删除门也会删除房子
@OneToOne
@OnDelete(action = OnDeleteAction.CASCADE)
Object door;
在这里阅读更多信息:它们不是一回事。JPA级联向下遍历对象图,而数据库外键操作有效地向上遍历对象图。例如,假设您有一对一的方向关系
class House {
@OneToOne
Object door;
}
如果使用CascadeType.REMOVE,则删除房屋也将删除门
@OneToOne(cascade=CascadeType.REMOVE)
Object door;
如果您使用@OnDelete,那么删除门也会删除房子
@OneToOne
@OnDelete(action = OnDeleteAction.CASCADE)
Object door;
请在此处阅读更多信息: