使用PostgreSQL,为什么Hibernate / JPA不会创建级联约束?

我有一个实体Bar

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "bar") private Set fooSet; 

一个实体Foo

 @ManyToOne(optional = false) @JoinColumn(name = "bar_id") private Bar bar; 

Hibernate在foo.bar – > bar.id上创建外键约束,但它没有指定ON DELETE CASCADE 。 为什么不? 有没有办法实现它?

或者我可以在DB中手动添加ON DELETE CASCADE (并禁用DDL生成), 这是一个好习惯吗? 而且,我是否必须以某种方式修改我的代码以让Hibernate知道数据库会自动删除相关记录?

谢谢。

更新 – 这是我的JPA / Hibernate / PostgreSQL配置:

                    true update     

更新2 – 阐明了我的意思:创建了外键约束,但我想知道为什么它没有指定ON DELETE CASCADE (相应地更改了原始问题)

Hibernate手动管理级联操作。 更重要的是,如果你在数据库上进行级联,而不是在Hibernate中声明它们(出于性能问题),在某些情况下你可能会遇到错误。 这是因为Hibernate将实体存储在其会话缓存中,因此它不会知道数据库是否会级联删除。

当您使用二级缓存时,情况会更糟,因为此缓存的寿命比会话长,并且db-side上的此类更改对于其他会话将是不可见的,因为旧的值存储在此缓存中。

我已经阅读了一些Hibernate源代码(非常不愉快的经历),我怀疑在任何情况下都可以在数据库端管理级联 – Hibernate设计有太多的假设与DB现实不兼容。

运用

  cascade = CascadeType.ALL 

如果执行任何操作,会导致hibernate遍历此关系。 它不会影响生成的DLL。

如果要删除fooSet中的所有实体,请添加orphanRemoval属性。

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "bar", orphanRemoval=true) 

也用

  

仅适用于开发环境。 不要用它来生产。 (例如,如果你重命名一个属性/列wil创建另一个列,甚至可能删除前一个列,hibernate也不知道如何更改表模式)。