使用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也不知道如何更改表模式)。
- “在注释ConcurrentHashMap时,在hibernate中非法尝试将非集合映射为@OneToMany,@ ManyToMany或@CollectionOfElements”
- 删除元素时,Hibernate单向OneToMany映射中的约束违反,包括JoinTable和OrderColumn
- Hibernate升级:StatisticsService()
- postInstantiate buildSessionFactory慢/内存庞大的数据库
- 如何取消正在运行的SQL查询?
- Spring Data JPA JpaRepository.save(实体)不返回数据库默认值
- 使用Annotations使用Spring Hibernate编写更少的DAO
- 知道何时达到数据库与缓存
- Hibernate参数化sql查询慢和活动的oracle会话