[英]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 id
或int 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_id
和rule_id
组成的复合键。 Community Id 是Communities
表中主键的外键。
为了实现这一点,我有 2 个课程。 Rule
和RulePrimaryData
。
规则.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.