首页 > 解决方案 > 在使用 Hibernate 和 Spring Boot 进行实体继承的情况下,如何避免多重创建 FK 约束

问题描述

我们在 Java 中将 Hibernate 与 Spring Boot 一起使用,并具有以下实体层次结构:

在此处输入图像描述

注意:没有 DashboardWidgetComposition 或 CommentingWidgetComposition 表。只有 WidgetComposition,它有一个 TYPE 列,将两个子实体的值分开。

当使用 Spring Boot Hibernate 启动我们的应用程序时,会尝试通过查看实体来创建表。然而,由于我们引入了新表格,我们看到了以下警告消息:

2021-09-13 15:14:56.863 [1;31mERROR[0;39m [           main] ... [36morg.hibernate.tool.hbm2ddl.SchemaExport [0;39m [35mHHH000389: Unsuccessful: alter table CommentingWidgetAssignment add constraint FK_eoss4oqc93g6i87b8bqj63lw6 foreign key (WIDGET_COMPOSITION_ID) references WidgetComposition[0;39m [34m[0;39m 
2021-09-13 15:14:56.863 [1;31mERROR[0;39m [           main] ... [36morg.hibernate.tool.hbm2ddl.SchemaExport [0;39m [35mBedingung "FK_EOSS4OQC93G6I87B8BQJ63LW6" besteht bereits
Constraint "FK_EOSS4OQC93G6I87B8BQJ63LW6" already exists; SQL statement:
alter table CommentingWidgetAssignment add constraint FK_eoss4oqc93g6i87b8bqj63lw6 foreign key (WIDGET_COMPOSITION_ID) references WidgetComposition [90045-192][0;39m [34m[0;39m 
2021-09-13 15:14:56.865 [1;31mERROR[0;39m [           main] ... [36morg.hibernate.tool.hbm2ddl.SchemaExport [0;39m [35mHHH000389: Unsuccessful: alter table DashboardWidgetAssignment add constraint FK_lv0oeri9odmo5ph60jhpl9wm8 foreign key (WIDGET_COMPOSITION_ID) references WidgetComposition[0;39m [34m[0;39m 
2021-09-13 15:14:56.866 [1;31mERROR[0;39m [           main] ... [36morg.hibernate.tool.hbm2ddl.SchemaExport [0;39m [35mBedingung "FK_LV0OERI9ODMO5PH60JHPL9WM8" besteht bereits
Constraint "FK_LV0OERI9ODMO5PH60JHPL9WM8" already exists; SQL statement:
alter table DashboardWidgetAssignment add constraint FK_lv0oeri9odmo5ph60jhpl9wm8 foreign key (WIDGET_COMPOSITION_ID) references WidgetComposition [90045-192][0;39m [34m[0;39m 

简而言之

Unsuccessful: alter table DashboardWidgetAssignment add constraint FK_eoss4oqc93g6i87b8bqj63lw6 foreign key (WIDGET_COMPOSITION_ID) references WidgetComposition

如果我 - 例如 - 将 DashboardWidgetAssignment 更改为不从 WorkCenterWidgetAssignment 继承,而是直接引用 DashboardWidgetComposition,我不会收到该消息。

在此处输入图像描述

为什么 hibernate 在继承的情况下会尝试创建两次 FK 约束?我怎样才能防止这种情况?我错过了正确的注释吗?

非常欢迎任何提示和/或帮助。

标签: javaspring-boothibernate

解决方案


推荐阅读