2017-02-21 3 views
0

조사를 만들려고합니다. 설문 조사는 일련의 질문으로 구성됩니다. 각 질문은 차례로 답변 값 모음으로 구성됩니다.유일하지 않은 모든 열이있는 @jointable 사용

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

을 나는 각각의 질문에 Answervalues을 연결 한 같은 방법으로 : 내가 원하는대로

@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>(); 

테이블이 데이터베이스에 작성됩니다

나는이 같은 설문 조사 질문에 묶여있다 그 (것)들 : 설문 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. 

가 어떻게이 가능하도록 테이블을 변경할 수 있습니까? 편집

:

@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

은 아마도 다음과 같은 시도 : 여기 내 설문 조사 빌드의 논리입니다 간단한 JUnit 테스트에서 이것을 사용

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(); 

을, 나는 다음을 만들 수 있었다 잘 테이블 :

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

참고 : 나는 캐스케이드 = CascadeType.PERS을 사용 @OneToMany 관계에 대한 IST :

@OneToMany(cascade = CascadeType.PERSIST)