2016-02-12 104 views
0

enter image description hereJAP如何有主鍵的外鍵關係,而無需額外的列或額外映射表

從圖片,是有可能有QUALIFICATION_ID作爲無需額外映射列或表ID的外鍵?

表 - > TM_QUALIFICATIONS是一個主表,ID被自動生成UUID和名稱是字符串值。值將在應用程序啓動時插入到此表中。

TABLE - > TM_USER_QUALIFICATIONS,一個用戶可以有多個資格。

因此,如果沒有任何其他額外映射列或表,是否可以將QUALIFICATION_ID標記爲外鍵?

另外,如何將USER_ID和QUALIFICATION_ID組合爲TM_USER_QUALIFICATIONS表的複合主鍵?

在此先感謝

回答

1

我不認爲你可以定義外鍵關係,而無需額外的列或額外的映射表。

如果我理解正確的話,你可以這樣做

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明確定義爲外鍵。