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アノテーションを主キーのゲッターの上に配置すると...

@Entity
public class SurveyResponse {

    private String assignmentId;

    @Id 
    public String getAssignmentId() {
        return assignmentId;
    }

    ...

}

...テーブルRelevanceScoreの生成に失敗します。なんで?

4

1 に答える 1

3

簡単な答え:注釈をフィールドに配置するかゲッターに配置するかを選択する必要があります。それらを混在させることはできません。

長い答え:Hibernateは@Idアノテーションを探します; フィールド上にある場合は、フィールド上の他のすべての注釈を検索し、ゲッターを探すことすらしません。逆も当てはまります。@Idアノテーションがゲッター上にある場合、他のフィールドに付けたアノテーションは考慮されません。

これが、getAssignmentメソッドで@Idアノテーションを移動するだけではテーブルが生成されない理由です。また、関連するゲッターにtopicRelevanceフィールドを説明するすべてのアノテーションを配置する必要があります。

于 2012-08-02T21:48:14.583 に答える