如何禁用Hibernate中关联无主键表的ManyToMany中间表外键创建?
可用解决方案
方案1:仅针对当前多对多关联禁用外键生成
在@ManyToMany注解上搭配@JoinTable注解,显式指定外键约束模式为不生成即可,代码示例:
@Entity public class Entity1 { @Id @GeneratedValue(...) private long id; @ManyToMany( targetEntity = "entity2", fetch = LAZY ) @JoinTable( name = "entity1_entity2", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT) ) private Entity2 entity2; }
其中foreignKey对应中间表指向Entity1的外键,inverseForeignKey对应中间表指向Entity2的外键,按需设置为NO_CONSTRAINT即可跳过对应外键的创建。
方案2:全局禁用Hibernate的外键生成
在Hibernate配置文件中添加如下配置项,全局关闭DDL生成阶段的外键创建逻辑:
hibernate.schema.foreign_keys = false
如果是Spring Boot项目,对应配置为:
spring.jpa.properties.hibernate.schema.foreign_keys = false
该配置优先级高于注解配置,生效后所有实体关联的外键都不会自动创建。
方案3:兜底自定义中间表映射
如果上述配置不生效,可以放弃使用@ManyToMany隐式生成中间表的逻辑,手动定义中间表实体,将关联字段设为普通的ID字段,自行实现关联查询逻辑,完全避开外键约束检查。
关于是否需要提交Issue:Hibernate目前对PostgreSQL分区表的主键/约束识别逻辑确实存在适配不足的问题,如果你需要框架原生支持该场景,可以向官方提交Issue反馈,不过上述方案已经可以覆盖绝大多数业务场景的需求。
内容的提问来源于stack exchange,提问作者gallyamb
相关产品推荐
相关产品推荐

