JAP如何有主键的外键关系,而无需额外的列或额外映射表

问题描述:

enter image description hereJAP如何有主键的外键关系,而无需额外的列或额外映射表

从图片,是有可能有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明确定义为外键。