我不認爲你可以定義外鍵關係,而無需額外的列或額外的映射表。
如果我理解正確的話,你可以這樣做
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明確定義爲外鍵。