首页 > 解决方案 > 在 Hibernate Spring Boot 中覆盖外键和唯一约束创建

问题描述

我在 Spring Boot 应用程序中有以下 Hibernate 关系。

@Entity
@Table(name = "projects")
public class Project {
    
    @Embedded
    private ProjectParameters parameters;
        
}
    
@Embeddable
public class ProjectParameters {
    @Column(name = "hvacConfigs")
    @ElementCollection(targetClass = HVACUserConfigModel.class)
    @CollectionTable(uniqueConstraints = @UniqueConstraint(columnNames = {}), foreignKey = ForeignKey(name = "project_hvacConfig_fk"))
        private Set<HVACUserConfigModel> hvacConfigs;
}
    
@Entity
@Table(name = "hvacuserconfig")
public class HVACUserConfigModel {
    
    @Id
    @GeneratedValue
    private Integer id;
        
}

Mysql表自动生成如下。请在以下链接中打开图片,因为我没有 10 名声望在 stackoverflow 上发布图片。

桌子

外键

独特的约束

选择查询结果

问题是我可以使用相同的项目保存多个项目,如下所示

Project_uid | hvacConfigs_id
------------------------------
  1001      | 1
  1001      | 2

添加 (1002 | 1) 会引发唯一约束冲突。

我可以通过删除唯一约束UK_me0ekntab0gknshag0xjjv35x使用 mysql 工作台显式更改表定义来使其工作。要删除唯一约束,我必须首先删除由唯一约束引用的外键约束FKeygabcnr2stdchxqpb5wuinf2 。在这些更改之后,我从 spring boot 应用程序中插入新行,它已成功添加值(1002 | 1) & (1002 | 2)

我能够探索在 Java 代码的hvacConfigs字段中注释的@CollectionTable注释提供了将 uniqueConstraint 和 foreignKey 定义作为属性定义的一部分插入的方法。我尝试调整注释的这些属性,但没有成功。

如果您有任何解决方案,请让我知道如何使用 java 代码覆盖唯一约束和外键约束,这样就可以在不显式手动调整 mysql 表的情况下工作。

标签: javamysqlspringdatabasehibernate

解决方案


我们使用 ManytoMany 注释而不是 ElementCollection 注释解决了这个问题。它的工作方式与创建新的中间表以包含项目 ID 和 HVACUserConfigModel id 的方式相同,但不会创建唯一索引。


推荐阅读