繁体   English   中英

如何创建一个外键和一个主键的复合键 Spring 数据 JPA

[英]How to create a composite key of one foreign key and one primary key Spring Data JPA

我正在使用 Spring Boot 来构建 API。 它是用于惩罚系统的 API。 在数据库中有两个用于规则的表,它们是规则表和社区表。 在此处输入图像描述

规则 ID 是 integer,社区 ID 是来自社区表的外键。 一个社区预计有 0、1 或多个规则,而规则仅由一个社区制定。

这是我希望在 Spring 引导应用程序中复制的行为。

到目前为止,我有以下代码:

社区.java

@Entity // Maps to database
public class Community {
    @Id
    @Column(name = "id", length = 16, unique = true, nullable = false)
    private UUID id;

    @Column(name = "username", length = 20, nullable = false)
    private String name;

规则.java

@Entity // Maps to database
public class Rule {

    @EmbeddedId
    private RuleId ruleId;

    @Column(name = "description", length = 50, nullable = false)
    private String description;

RuleId.java

@Embeddable
public class RuleId implements Serializable {

    private UUID communityId;
    private Integer ruleId;

    public RuleId(UUID communityId, Integer ruleId) {
        this.communityId = communityId;
        this.ruleId = ruleId;
    }

我已经阅读了堆栈上的一些线程,这是我从中获得嵌入式想法的地方,但我仍然对如何让它与我的场景一起工作感到困惑。 任何帮助都非常感谢,只是为了消除这种混乱。

干杯:)

您可以使用注释@JoinColumn(...)并指定关系,在您的情况下: @OneToOne(...)

然后,您可以简单地使用Long idint id定义您的Rule实体,并将其定义为:

@Entity
public class Rule {
    
    @Id // map as id field
    @GeneratedValue(strategy = GenerationType.AUTO) // Auto generate id when update db
    @Column(name = "Rule_Id") // map the column field
    private Long ruleId;
    
    // Simply add annotation to map foreign key
    @OneToOne
    @JoinColumn(name = "community_id_fk", referencedColumnName = "community_id")
    private Community community;    

    // more field ...
    @Column(name = "description", length = 50, nullable = false)
    private String description;
}

有关更多指南,您可以查看https://www.baeldung.com/jpa-one-to-one

我通过 Zukaru 的回答中的一对一关系解决了这个问题。

我想要的是由community_idrule_id组成的复合键。 Community Id 是Communities表中主键的外键。

为了实现这一点,我有 2 个课程。 RuleRulePrimaryData

规则.java

@Entity // Maps to database
@Table(name = "rules")
@Data
@NoArgsConstructor
public class Rule {

    @EmbeddedId
    private RulePrimaryData id;

    @OneToOne
    @JoinColumn(name = "community_id_fk", referencedColumnName = "community_id", insertable = false, updatable = false)
    private Community communities;

    @Column(name = "description", length = 50, nullable = false)
    private String description;

    public Rule(RulePrimaryData ruleId, String description) {
        this.id = ruleId;
        this.description = description;
    }
}

嵌入的 Id 用于制作包含 UUID 和 Integer 的复合键。

RulePrimaryData.java

@Embeddable
@NoArgsConstructor
@Data //Getters, setters, constructors
public class RulePrimaryData implements Serializable {

    @Column(name = "community_id_fk", nullable = false)
    private UUID communityId;

    @Column(name = "rule_id", nullable = false)
    private Integer ruleId;

    public RulePrimaryData(UUID communityId, int ruleId) {
        this.communityId = communityId;
        this.ruleId = ruleId;
    }
}

最后,这种关系是一对一的,我最初认为是多对一。 在定义中,我将 EmbeddedId 中的community_id_fk列连接到 Communities 表中的community_id列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM