2017-02-21 5 views
0

調査を作成しようとしています。調査は一連の質問で構成されています。 各質問は、答えの集まりから成り立っています。ユニークでないすべての列で@jointableを使用する

私はこのような調査に質問を結び付けている:私が望むよう

@OneToMany() 
@JoinTable(
     name = "question_answer_value_list", 
     joinColumns = @JoinColumn(name = "question_id"), 
     inverseJoinColumns = @JoinColumn(name = "answer_value_list_id")) 
private Collection<AnswerValue> answerValueList = new ArrayList<AnswerValue>(); 

テーブルがデータベースに作成されています。私は、各質問にAnswervaluesを縛られているのと同じ方法で

@OneToMany() 
@JoinTable(
     name = "survey_question_list", 
     joinColumns = @JoinColumn(name = "survey_id"), 
     inverseJoinColumns = @JoinColumn(name = "question_list_id")) 
private Collection<Question> questionList = new ArrayList<Question>(); 

回答IDに結びついたアンケートIDと回答IDに結びついた質問ID。

私の問題は、私は次のエラーを取得することです:

enteorg.mariadb.jdbc.internal.util.dao.QueryException: Duplicate entry '1' for key 'UK_eky8oymsfv24p3r4by54m15ta' 
Query is: insert into question_answer_value_list (question_id, answer_value_list_id) values (?, ?), parameters [2,1] 

私が見る問題は、IDのいずれかが、複数の同じIDのdissallowsた、ユニークであるということです。 しかし、各質問を可能な回答にマップする必要があります。つまり、質問IDと回答IDの両方を複数回表示する必要があります。 例: 質問1と質問2は3つの可能な答えを持っている、マッピングは次のようになりたい場合:

Question_Id Answer_Value_Id 
1   1 
1   2 
1   3 
2   1 
2   2 
2   3 
etc.   etc. 

は、どのように私はこれを可能にするために表を変更できますか?

EDIT:ここに は私の調査のビルドの論理です:

@RequestMapping("/createsurvey2") 
public Survey createSurvey2() { 
    Survey survey = new Survey(); 
    survey.setName("My First Survey"); 
    // surveyRepository.save(survey); 

    AnswerValue answerValue1 = new AnswerValue(1); 

    answerValueRepository.save(answerValue1); 

    Question question1 = new Question(); 
    question1.setQuestionContent("Was the Meeting Helpful?"); 
    question1.addAnswerValue(answerValue1); 

    questionRepository.save(question1); 

    survey.addQuestion(question1); 

    Question question2 = new Question(); 
    question2.setQuestionContent("Was the Meeting Horrible?"); 
    questionRepository.save(question2); 
    question2.addAnswerValue(answerValue1); 

    questionRepository.save(question2); 

    survey.addQuestion(question2); 

    Question question3 = new Question(); 
    question3.setQuestionContent("Was the Meeting Funny?"); 
    questionRepository.save(question3); 
    question3.addAnswerValue(answerValue1); 

    questionRepository.save(question3); 

    survey.addQuestion(question3); 


    surveyRepository.save(survey); 

    return survey; 
} 
+0

したがって、質問1と質問2が同じ回答セットを持つことを期待していますか?高レベルのコンセプトから、それはあなたのモデルにとって理にかなっていますか? –

+0

また、これらのエンティティで何をしているかによっても異なります。これらのオブジェクトを作成するロジックを提供できますか? –

+0

上記の編集をご覧ください。 –

答えて

0

おそらく、次の操作を試してください。

em.getTransaction().begin(); 

Answer a1 = new Answer(1, "Federal"); 
Answer a2 = new Answer(2, "State"); 
Answer a3 = new Answer(3, "Local"); 

List<Answer> q1_answers = Arrays.asList(a1, a2, a3); 
Question q1 = new Question(1, q1_answers); 

List<Answer> q2_answers = Arrays.asList(a1, a2, a3); 
Question q2 = new Question(2, q2_answers); 

List<Question> questions = Arrays.asList(q1, q2); 
Survey s = new Survey(1, questions); 

em.persist(s); 

em.getTransaction().commit(); 

簡単なJUnitテストでこれを使用して、私は次のものを作成することができましたテーブルはまあまあです:

QUESTION_ID ANSWER_VALUE_LIST_ID 
1     1 
1     2 
1     3 
2     1 
2     2 
2     3 

注:私はcascade = CascadeType.PERSを使用しました。 @OneToMany関係のIST:

@OneToMany(cascade = CascadeType.PERSIST) 
関連する問題