2017-02-21 1 views
0

Ich versuche, eine Umfrage zu erstellen. Die Umfrage besteht aus einer Sammlung von Fragen. Jede Frage wiederum besteht aus einer Sammlung von Antwortwerten.Verwenden von @jointable mit allen Spalten nicht eindeutig

Ich habe die Fragen gebunden wie diese Umfrage:

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

In der gleichen Weise, die ich Answervalues ​​auf jede Frage gebunden haben:

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

Die Tabellen werden erstellt, in der Datenbank, wie ich will sie: Umfrage-IDs, die mit Fragen-IDs und Fragen-IDs verknüpft sind, die mit Antwort-IDs verknüpft sind.

Mein Problem ist, dass ich die folgende Fehlermeldung erhalten:

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] 

Das Problem, das ich sehe, ist, dass eine der Ids eindeutig zuzuordnen ist, die für mehr gleich ids dissallows. Dennoch muss ich jede Frage auf eine mögliche Antwort abbilden, was bedeutet, dass sowohl die Frage-IDs als auch die Antwort-IDs mehrfach erscheinen müssen. Beispiel: Wenn die Frage 1 und Frage 2 haben 3 mögliche Antworten dann die Zuordnung würde wie folgt aussehen:

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

Wie kann ich die Tabelle ändern, um dies zu ermöglichen?

EDIT: ist die Logik meiner Umfrage Baujahr:

@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

Also, Sie erwarten, dass Frage 1 und Frage 2 den gleichen Satz von Antworten haben? Ist das für ein Modell von hohem Niveau? –

+0

Auch hängt es davon ab, was Sie mit diesen Entitäten tun. Können Sie Ihre Logik zum Erstellen dieser Objekte bereitstellen? –

+0

Siehe oben Bearbeiten. –

Antwort

0

Vielleicht versuchen Sie Folgendes:

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

diese Verwendung in einem einfachen JUnit-Test konnte ich folgendes erstellen just fine Tisch:

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

Hinweis: Früher habe ich Kaskade = CascadeType.PERS IST auf den @OneToMany Beziehungen:

@OneToMany(cascade = CascadeType.PERSIST) 
Verwandte Themen