質問、回答、QuestionDisplayRuleの3つのエンティティをマッピングしようとしています。質問には多くのAnswersと多くのQuestionDisplayRulesがそれぞれ1つの質問に属します。 QuestionDisplayRuleにはQuestionが1つ、Answerが1つ、String値のフィールドが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);
任意のアイデア?ありがとう!
なぜ複合キーを使用していますか?これは、良い理由から、HibernateとJPAによってはお勧めできません。なぜあなたはQuestionDisplayRuleで質問するための団体を持っていますか?それはすでにtoOne to Answerを持っているので、必要ではありません。これはtoOne to Questionを持っています。単一列の自動生成IDに固執すれば、人生ははるかに簡単になります。最後に、同じアソシエーションをIDに1回、エンティティに1回、マッピングします。 –
QuestionDisplayRuleのマッピング質問は、1つの回答参照とは異なる質問です。 QuestionDisplayRuleは、「この回答への回答(およびその後の質問)がanswerValueと一致すれば、この質問を表示する」と同じです。そして、私はデータベース設計がHibernateによって指示されるように感じるので、私は単一の列IDを導入したくありません。それはそれに影響を与えてはならない。フレームワークは来て、データは何年も残っています.. –