Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制Hibernate使用ON DELETE CASCADE创建外键_Hibernate_Jpa_Foreign Keys - Fatal编程技术网

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

强制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

当Hibernate(或另一个JPA实现)为@OneToMany关系创建外键时,有没有办法强制它在数据库级别的删除级联上使用?我发现,当我使用CascadeType.DELETE时,Hibernate不会在数据库级别执行此操作,而是发送两条DELETE语句(用于父记录和子记录)。或者可能有一个很好的理由?

在hibernate中,您可以使用

@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;
请在此处阅读更多信息: