我认为如果没有额外的列或额外的映射表,您就无法定义外键关系。
如果我理解正确,你可以做类似的事情
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 作为外键,你需要编写单独的 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 显式定义为外键。