JAP如何有主键的外键关系,而无需额外的列或额外映射表
问题描述:
从图片,是有可能有QUALIFICATION_ID作为无需额外映射列或表ID的外键?
表 - > TM_QUALIFICATIONS是一个主表,ID被自动生成UUID和名称是字符串值。值将在应用程序启动时插入到此表中。
TABLE - > TM_USER_QUALIFICATIONS,一个用户可以有多个资格。
因此,如果没有任何其他额外映射列或表,是否可以将QUALIFICATION_ID标记为外键?
另外,如何将USER_ID和QUALIFICATION_ID组合为TM_USER_QUALIFICATIONS表的复合主键?
在此先感谢
答
我不认为你可以定义外键关系,而无需额外的列或额外的映射表。
如果我理解正确的话,你可以这样做
TM_QUALIFICATIONS
@Entity
@Table(name = "TM_QUALIFICATIONS")
public class Qualifications {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
并作出QUALIFICATION_ID为外键,U编写单独的DDL添加约束。
@Repository
public interface UserQualificationsRepository extends CrudRepository<UserQualifications, String>{
@Modifying
@Transactional
@Query(value = "ALTER TABLE TM_USER_QUALIFICATIONS ADD FOREIGN KEY (QUALIFICATION_ID) REFERENCES TM_QUALIFICATIONS(ID)", nativeQuery = true)
public void addForeignKeyConstraint();
}
TM_USER_QUALIFICATIONS
@Entity
@Table(name = "TM_USER_QUALIFICATIONS")
@IdClass(UserQualificationPK.class)
public class UserQualifications {
@Id
@Column(name = "USER_ID")
private String userId;
@Column(name = "LEVEL")
private int level = 0;
@Id
@Column(name = "QUALIFICATION_ID")
private String qualificationId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
最后的复合主键使用@IdClass注释
public class UserQualificationPK implements Serializable {
private String userId;
private String qualificationId;
public UserQualificationPK(String userId, String qualificationId) {
this.userId = userId;
this.qualificationId = qualificationId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getQualificationId() {
return qualificationId;
}
public void setQualificationId(String qualificationId) {
this.qualificationId = qualificationId;
}
}
这样ü可以达到你的要求。 TM_QUALIFICATIONS和TM_USER_QUALIFICATIONS之间没有关系,但是您通过本机SQL将QUALIFICATION_ID明确定义为外键。