0

Hibernate と JPA を使用して 1 対 1 の関係を実装したいと考えていました。階層の一部である 2 つのクラスがあります: 質問階層と回答階層です。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class QuestionUnit {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private int id;

    @OneToOne(cascade = CascadeType.ALL)    
    @PrimaryKeyJoinColumn
    private AnswerUnit correctAnswer;
...}


@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AnswerUnit {

    @Id
    private int id;

    public abstract Object getAnswerContent();

    public abstract boolean isEqual(AnswerUnit otherAnswer);

    public int getId() {
        return id;
    }
}

実装として OpenQuestion と OpenAnswer があります。

OpenQuetions を含むテーブルには自動生成された主キーがあり、OpenAnswer を含むテーブルには OpenQuestion テーブルの主キーと同じ値を持つ主キーがあるようにしたかったのです。

ここの例に従ってみました: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html part 2.2.5.1. 一対一。

しかし、OpenQuestion を永続化すると、テーブル OpenQuestion の columnsidquestionContentOpenQuestionAnswerのid,answerContentが得られますが、ID の値が一致しません。

それで、私はどこで間違いを犯していますか?

4

2 に答える 2

0

「OpenQuestion」に「CorrectAnswer」欄はありませんか?
これは、「OpenAnswer」の ID 列への外部キーである
必要があります。つまり、これらは一致する ID 値である必要があります。
この列がない場合 - JPA マッピングに何らかのエラーがあると思われます。
編集 - 自分自身に -
MappedSuperClass を追加してください。それについてはこちらをお読みください。

于 2012-08-13T15:02:32.103 に答える
0

何をしようとしているのかよくわかりませんが、質問から回答まで 1 対 1 の関係を築いているのはなぜですか?? ロジックは、質問には多くの回答が含まれる可能性があることを示しています (おそらく正解は 1 つだけです)。

そして、そのアプローチを使用すると、2 つの ID が等しいことを気にする必要はありません。その場合は、次のようなモデルが必要です。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class QuestionUnit {
    @Id ... private int id;
    @OneToMany private List<AnswerUnit> answers; //optional assuming there's a list of answers for every question
    @ManyToOne private AnswerUnit correctAnswer;

    public void setCorrectAnswer(AnswerUnit answer){
        if(answer.getQuestion().equals(this)){ //or maybe instead answer.setQuestion(this)
            this.correctAnswer = answer;
        }else{
            throw new RuntimeError("Answer does not belong to this question");
        }
    }

    //Other getter and setters
    //Override the "equals" method!!!
}


@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AnswerUnit {
    @Id private int id;
    @OneToMany private QuestionUnit question;

    public abstract Object getAnswerContent();    
    public abstract boolean isEqual(AnswerUnit otherAnswer); //should't you just overwrite the equals method in here?    
    //Other getter, setters, etc
}

そして、それを使用するには、次のようにします。

QuestionUnit q = new OpenQuestion();
List<AnswerUnit> answers = new List<OpenAnswer>();

AnswerUnit a1 = new OpenAnswer();
AnswerUnit a2 = new OpenAnswer();
AnswerUnit a3 = new OpenAnswer();

a1.setQuestion(q);
a2.setQuestion(q);
a3.setQuestion(q);

//Also set the contents and other required info for the questions...

//And then associate the instances:
q.setAnswers(answers);
q.setCorrectAnswer(a3);

em.persist(q);

これは、オープンで通常の回答でも機能します

于 2012-08-14T15:14:32.980 に答える