要解决此问题,请更改您的代码,如下所示:
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "userrole_value", referencedColumnName = "VALUE"),
@JoinColumn(name = "userrole_desc", referencedColumnName = "DESCRIPTION")
})
private studentdetails userrole;
问题原因:在映射中:
@JoinColumns({
@JoinColumn(name = "userrole", referencedColumnName = "VALUE"),
@JoinColumn(name = "userrole_desc", referencedColumnName = "DESCRIPTION")
})
你告诉hibernate创建一个外键Student
实体表称为userrole
指的是名为VALUE
in StudentDetails
实体表。
然后在下一行中,您再次告诉 hibernate 使用相同的列名 -userrole
作为列的 FKeyDESCRIPTION
in StudentDetails
,因此这一行会覆盖前一行。
因此,hibernate 发现您正在尝试将单个列作为外键Student
映射到的实体表StudentDetails
实体表。但是StudentDetails
表有由 2 列组成的复合键,因此 hibernate 会抛出异常。
org.hibernate.MappingException: Foreign key (FK6D56043A4415BDB5:student [userrole])) must have same number of columns as the referenced primary key (student_details [VALUE,DESCRIPTION])
附加信息:
您正在尝试为实体声明一个复合 IDStudentDetails
,所以这个实体应该实现Serializable
接口,这是强制性的。
现在这个复合 Id 类应该重写equals()
and hashcode()
方法。
只是一个建议,请尝试遵循实体和字段的 Java 命名约定。