java将@Id注释放在访问器上方会导致创建元素集合表失败
当我运行以下类时:
@Entity
public class SurveyResponse {
@Id
private String assignmentId;
public String getAssignmentId() {
return assignmentId;
}
public void setAssignmentId(String assignmentId) {
this.assignmentId = assignmentId;
}
@ElementCollection
@MapKeyColumn(name="topic")
@Column(name="relevance")
@CollectionTable(name="RelevanceScore", joinColumns=@JoinColumn(name="assignmentId"))
Map<Topic, Relevance> topicRelevance = new HashMap<Topic, Relevance>(); // maps from attribute name to value
public static void main( String[] args ) {
Configuration config = new Configuration();
config.addAnnotatedClass(SurveyResponse.class);
config.configure( "hibernate.cfg.xml" );
new SchemaExport(config).create( true, true );
}
}
它按预期创建SurveyResponse和RelevanceScore表。但是,当我将@Id注释放在主键的getter之上时
@Entity
public class SurveyResponse {
private String assignmentId;
@Id
public String getAssignmentId() {
return assignmentId;
}
...
}
。。。它无法生成表关联核心。为什么?
# 1 楼答案
简短回答:您必须选择是将注释放在字段上还是放在getter上,不能混合使用它们
详细回答:Hibernate查找@Id注释;如果它在一个字段上,那么它会在字段上查找所有其他注释,甚至不必查看getter。反之亦然:如果@Id注释位于getter上,则不会考虑您在其他字段上的注释
这就是为什么如果只在getAssignment方法上移动@Id注释,就不会生成表;您还应该将描述topicRelevance字段的所有注释放在其相关getter上