2012-02-10 10 views
1

質問、回答、QuestionDisplayRuleの3つのエンティティをマッピングしようとしています。質問には多くのAnswersと多くのQuestionDisplayRulesがそれぞれ1つの質問に属します。 QuestionDisplayRuleにはQuestionが1つ、Answerが1つ、St​​ring値のフィールドが1つあります。 QuestionDisplayRuleのdbテーブルは次のようになります。JPA、Hibernate:関連があるコンポジットキー。読み込みはしても保存しないのはなぜですか?

create table question_display_rule(
    question_id int, 
    answer_id int, 
    answer_value varchar(128) 
); 

もちろん、question_idとanswer_idはPKです。

JPAマッピングは次のようになります。

@Embeddable 
public class QuestionDisplayRulePK implements Serializable { 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="question_id", insertable = false, updatable = false) 
    private Question question; 

    @ManyToOne 
    @JoinColumn(name = "answer_id", insertable = false, updatable = false) 
    private Answer answer; 
} 

@Entity 
@Table(name = "question_display_rule") 
public class QuestionDisplayRule implements Serializable { 

    @EmbeddedId 
    private QuestionDisplayRulePK id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="question_id", insertable = false, updatable = false) 
    private Question question; 

    @ManyToOne 
    @JoinColumn(name = "answer_id", insertable = false, updatable = false) 
    private Answer answer; 

    @Column(name="answer_value") 
    private String answerValue; 

} 

問題は、私はDBにレコードを手動で追加しますが、それらを保存しない場合、それはQuestionDisplayRulesがうまくロードすることです。エラーなし、ノー何も...

テストコード:

QuestionDisplayRulePK qPK = new QuestionDisplayRulePK(); 
    qPK.setQuestion(q); 
    qPK.setAnswer(a); 

    QuestionDisplayRule qr = new QuestionDisplayRule(qPK, "Yes"); 
    qr.setAnswerValue("whateva.."); 

    .... 
    // DAO code looks like: getSession().saveOrUpdate(qr); 

任意のアイデア?ありがとう!

+0

なぜ複合キーを使用していますか?これは、良い理由から、HibernateとJPAによってはお勧めできません。なぜあなたはQuestionDisplayRuleで質問するための団体を持っていますか?それはすでにtoOne to Answerを持っているので、必要ではありません。これはtoOne to Questionを持っています。単一列の自動生成IDに固執すれば、人生ははるかに簡単になります。最後に、同じアソシエーションをIDに1回、エンティティに1回、マッピングします。 –

+0

QuestionDisplayRuleのマッピング質問は、1つの回答参照とは異なる質問です。 QuestionDisplayRuleは、「この回答への回答(およびその後の質問)がanswerValueと一致すれば、この質問を表示する」と同じです。そして、私はデータベース設計がHibernateによって指示されるように感じるので、私は単一の列IDを導入したくありません。それはそれに影響を与えてはならない。フレームワークは来て、データは何年も残っています.. –

答えて

1

埋め込み可能なエンティティをマッピングしていますが、これは間違っています。埋め込み型には基本型のみを含める必要があります。つまり、エンティティは次のようになります。

@Entity 
public class Question 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Long id; 
    @OneToMany(mappedBy = "question") 
    private Set<Answer> answers; 
} 

@Entity 
public class Answer 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Long id; 

    @ManyToOne 
    private Question question; 
} 

@Entity 
public class QuestionDisplayRule 
{ 
    @EmbeddedId 
    private QuestionDisplayRulePK key; 

    @MapsId(value = "questionId") 
    @ManyToOne 
    @JoinColumn(name = "question_id", referencedColumnName = "id") 
    private Question question; 

    @MapsId(value = "answerId") 
    @ManyToOne 
    @JoinColumn(name = "answer_id", referencedColumnName = "id") 
    private Answer answer; 
} 

@Embeddable 
public class QuestionDisplayRulePK 
{ 
    @Column(name = "answer_id") 
    private Long answerId; 
    @Column(name = "question_id") 
    private Long questionId; 
} 
関連する問題