在 Spring Boot jpa 中将多个外键映射到同一个主键

Posted

技术标签:

【中文标题】在 Spring Boot jpa 中将多个外键映射到同一个主键【英文标题】:Map multiple foreign keys to same primary key in Springboot jpa 【发布时间】:2022-01-16 08:53:03 【问题描述】:

我正在 springboot 中开发一个简单的 todos 应用程序。我正在使用 mysql。 我有两个实体类:用户 B.待办事项 现在我想映射表格,以便存储以下详细信息:

    哪个用户创建了待办事项 哪个用户完成了该项目 哪个用户删除了该项目

用户实体具有主键“id”列和一个非空的非空列“publicUserId”。

设计两张表最合适的方式是什么?

【问题讨论】:

【参考方案1】:

要避免可怕的“150”错误,请执行以下操作之一

创建表Usersfirst,这样 FK 声明才能起作用。 (如下例所示。) 使用ALTER 在两个表之后添加外键 都是CREATEd

示例创建:

CREATE TABLE Users(
    publicUserId MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    -- ...
    PRIMARY KEY(publicUserId)
) ENGINE=InnoDB;

CREATE TABLE ToDos (
    -- ...
    created_by   MEDIUMINT UNSIGNED NOT NULL,
    completed_by MEDIUMINT UNSIGNED     NULL,
    deleted_by   MEDIUMINT UNSIGNED     NULL,
    -- ...
    FOREIGN KEY(created_by)   REFERENCES Users(publicUserId),
    FOREIGN KEY(completed_by) REFERENCES Users(publicUserId),
    FOREIGN KEY(deleted_by)   REFERENCES Users(publicUserId)
) ENGINE=InnoDB;

注意事项:

MEDIUMINT UNSIGNED 允许 16M“用户”并占用 3 个字节;相应调整。 我假设 ToDo 总是有 created_by,因此是 NOT NULL,但其他两个用户 ID 以 NULL 开头。 架构可以在没有任何 FK 的情况下正常工作。您唯一失去的是在某些情况下的动态一致性检查。也就是说,您可以在没有任何 FK 的情况下构建您的应用。 至于如何在您使用的框架中进行等效操作,...抱歉,我的大脑已经没有足够的空间来用两种不同的语言学习相同的东西了。

【讨论】:

我会尝试找到一些与框架相关的解决方案,如果找不到,我会选择这个。感谢您的回复

以上是关于在 Spring Boot jpa 中将多个外键映射到同一个主键的主要内容,如果未能解决你的问题,请参考以下文章

JPA OneToOne,外键在 Spring Boot 上为空

外键在一对多关系中始终为空 - Spring Boot Data with JPA

在 Spring Boot jpa 中将延迟加载的对象转换为 JSON

Spring boot JPA OneToOne 配置问题

如何在 Spring Boot JPA 中使用多个 json 数组?

制作多个 EntityManager(Spring-Boot-JPA、Hibernate、MSSQL)