1

当我运行以下课程时:

@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;
    }

    ...

}

...它无法生成表 RelevanceScore。为什么?

4

1 回答 1

3

简短回答:您必须选择是将注释放在字段上还是放在 getter 上,您不能混合使用它们。

长答案:Hibernate 寻找 @Id 注释;如果它在一个字段上,它会查找字段上的所有其他注释,甚至不费心去查看 getter。反之亦然:如果 @Id 注释在 getter 上,则不会考虑您在其他字段上放置的注释。

这就是为什么如果您只在 getAssignment 方法上移动 @Id 批注,则不会生成表的原因;您还应该将描述 topicRelevance 字段的所有注释放在其相关的 getter 上。

于 2012-08-02T21:48:14.583 回答