1

OneToMany マッピングを持つ 2 つのクラスがあります。Question クラスと Answer クラスがあります。すべての質問に対して、表に 4 つの回答が書かれています。テーブルには 10 の質問行と対応する 40 の回答行があります。リストを取得しようとすると、質問ごとに 4 つの重複がある 10 ではなく、40 の質問が表示されます。

ここに私の質問クラスがあります:

@Entity
@Table(name = "QUESTIONS")
public class Question implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "QUES_ID_SEQ")
    @SequenceGenerator(name = "QUES_ID_SEQ", sequenceName = "QUES_ID_SEQ")
    @Column(name = "QUESTION_ID")
    private Long id;

    @Column(length = 255)
    private String question;

    @OneToMany(targetEntity = Answer.class, fetch = FetchType.EAGER)
    @Cascade(CascadeType.SAVE_UPDATE)
    @JoinTable(name = "QNA",
                joinColumns = @JoinColumn(name = "QUESTION_ID"),
                inverseJoinColumns = @JoinColumn(name = "ANSWER_ID", referencedColumnName = "ANSWER_ID"))
    private List<Answer> answers;

    public Question() {}

// getters and setters ...
}

これが私の Answer クラスです:

@Entity
@Table(name = "ANSWERS")
public class Answer implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ANS_ID_SEQ")
    @SequenceGenerator(name = "ANS_ID_SEQ", sequenceName = "ANS_ID_SEQ")
    @Column(name = "ANSWER_ID")
    private Long id;

    @Column(length = 255)
    private String answer;

    private boolean correct;

    public Answer() {}

// getters and setters ...
}

私はこのような質問を取得しています:

    @Transactional
    public List<Question> retrieveQuestions(){
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Question.class);
        return (List<Question>) criteria.list();
    }
4

2 に答える 2

3

また、次のコードを使用して問題を解決しました。

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Question.class);
        return (List<Question>) criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

Criteria.DISTINCT_ROOT_ENTITY <- このコードは、一意の質問を取得するのに役立ち、FetchType.EAGERも使用しました。それはうまく機能します。

于 2012-08-20T07:57:55.873 に答える
0

マッピングが正しくありません。質問から回答まで 1 対多の関連付けがある場合、結合テーブルがあるのはなぜですか?

この 1 対多の関連付けの正しいマッピングは次のようになります。

応答時クラス:

@ManyToOne
@JoinColumn(name = "question_id")
public Question getQuestion() {
    return question;
}

質問クラスについて:

@OneToMany(mappedBy = "question", fetch = FetchType.EAGER)
public List<Answer> getAnswer() {
    return answers;
}

もう 1 つ: Question クラスの 1 つのコレクション マッピングでは FetchType.EAGER を使用しても問題ありませんが、もう 1 つのコレクションを FetchType.LAZY にマッピングすると、デカルト積のフェッチを回避できます。

于 2012-08-20T07:01:51.000 に答える