2017-01-19 1 views
0

Wenn ichNull in Reaktion

GET /survey/1 

ich diese Antwort erhalten, althought gibt es Fragen und Antworten in der Datenbank:

{ 
    "surveyId": 1, 
    "name": "Example", 
    "questions": null, 
    "answers": null 
} 

Warum ich in 'Fragen' null erhalten und 'Antworten' ? Wie könnte ich es reparieren?

SurveyRepository:

public interface SurveyRepository extends CrudRepository<Survey, Integer> { } 

Survey Modellklasse:

@Entity 
@Table(name = "survey") 
public class Survey { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "surveyId") 
    private Integer surveyId; 

    @Column(name = "name", nullable = false) 
    private String name; 

    @Transient 
    private List<String> questions; 

    @Transient 
    private List<String> answers; 

    public Survey() { } 

    public Survey(Integer surveyId, String name) { 
     this.surveyId = surveyId; 
     this.name = name; 
    } 

    public Integer getSurveyId() { 
     return surveyId; 
    } 

    public String getName() { 
     return name; 
    } 

    public List<String> getQuestions() { 
     return questions; 
    } 

    public List<String> getAnswers() { 
     return answers; 
    } 

    public void setSurveyId(Integer surveyId) { 
     this.surveyId = surveyId; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setQuestions(List<String> questions) { 
     this.questions = questions; 
    } 

    public void setAnswers(List<String> answers) { 
     this.answers = answers; 
    } 
} 

Survey Controller-Klasse:

@RestController 
@RequestMapping("/survey") 
public class SurveyController { 

    @Autowired 
    private SurveyRepository surveyRepo; 

    @Autowired 
    private AnswerRepository answerRepo; 

    @Autowired 
    private QuestionRepository questionRepo; 

    @RequestMapping(method = RequestMethod.GET, value = "/{id}") 
    public Survey getSurveyById(@PathVariable("id") int id) { 
     return surveyRepo.findOne(id); 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String create(@RequestBody Survey survey) { 
     surveyRepo.save(survey); 
     return "Survey created"; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public Iterable<Survey> getAllSurveys() { 
     return surveyRepo.findAll(); 
    } 

    @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") 
    public String delete(@PathVariable("id") int id) { 
     surveyRepo.delete(id); 
     return "Survey deleted"; 
    } 

    @RequestMapping(method = RequestMethod.PUT, value = "/{id}") 
    public String update(@PathVariable("id") int id, @RequestBody Survey survey) { 
     Survey update = surveyRepo.findOne(id); 

     update.setName(survey.getName()); 
     update.setQuestions(survey.getQuestions()); 

     surveyRepo.save(update); 
     return "Survey updated"; 
    } 

} 

Antwort Modellklasse:

@Entity 
@Table(name = "answer") 
public class Answer { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "answerId") 
    private Integer answerId; 

    @Column(name = "answer", nullable = false) 
    private String answer; 

    @ManyToOne 
    @JoinColumn(name = "questionId", nullable = false) 
    private Question questionId; 

    public Answer() { } 

    public Answer(Integer answerId, String answer, Question questionId) { 
     this.answerId = answerId; 
     this.answer = answer; 
     this.questionId = questionId; 
    } 

    public Integer getAnswerId() { 
     return answerId; 
    } 

    public String getAnswer() { 
     return answer; 
    } 

    public Question getQuestionId() { 
     return questionId; 
    } 

    public void setAnswerId(Integer answerId) { 
     this.answerId = answerId; 
    } 

    public void setAnswer(String answer) { 
     this.answer = answer; 
    } 

    public void setQuestionId(Question questionId) { 
     this.questionId = questionId; 
    } 

} 

Frage Modellklasse

@Entity 
@Table(name = "question") 
public class Question { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "questionId") 
    private Integer questionId; 

    @Column(name = "question", nullable = false) 
    private String question; 

    @ManyToOne 
    @JoinColumn(name = "surveyId", nullable = false) 
    private Survey surveyId; 

    @Transient 
    private List<String> answers; 

    public Question() { } 

    public Question(Integer questionId, String question, Survey surveyId) { 
     this.questionId = questionId; 
     this.question = question; 
     this.surveyId = surveyId; 
    } 

    public Integer getQuestionId() { 
     return questionId; 
    } 

    public String getQuestion() { 
     return question; 
    } 

    public Survey getSurveyId() { 
     return surveyId; 
    } 

    public void setQuestionId(Integer questionId) { 
     this.questionId = questionId; 
    } 

    public void setQuestion(String question) { 
     this.question = question; 
    } 

    public void setSurveyId(Survey surveyId) { 
     this.surveyId = surveyId; 
    } 
} 

Antwort

0

Sie nicht, eine Beziehung zu Ihrer Umfrage und Fragen haben.

A OneToMany Beziehung in Java ist, wo das Quellobjekt hat ein Attribut, das eine Sammlung von Zielobjekten speichert und wenn diese Zielobjekte die inverse Beziehung zurück zu dem Quellobjekt haben, es wäre eine ManyToOne Beziehung sein. Alle Beziehungen in Java und JPA sind unidirektional. Wenn ein Quellenobjekt auf ein Zielobjekt verweist, gibt es keine Garantie, dass das Zielobjekt auch eine -Beziehung zum Quellenobjekt hat. Dies ist anders als eine relationale Datenbank, in der Beziehungen durch Fremdschlüssel definiert sind und so abfragt, dass die inverse Abfrage immer existiert.

JPA definiert auch eine ManyToMany Beziehung, die zu einer OneToMany Beziehung ähnlich ist, außer, dass die inversen Beziehung (wenn es definiert wurde) ist eine ManyToMany Beziehung. Der Hauptunterschied zwischen einer OneToMany-Beziehung und einer ManyToMany-Beziehung in JPA ist, dass eine ManyToMany immer eine intermediäre relationale Join-Tabelle verwendet, um die Beziehung zu speichern, während OneToMany entweder eine Join-Tabelle oder einen Fremdschlüssel im Ziel verwenden kann Objekttabelle, die auf den Primärschlüssel der Quellobjekttabelle verweist. Wenn OneToMany einen Fremdschlüssel in der Tabelle des Zielobjekts verwendet, erfordert JPA, dass die Beziehung bidirektional ist (die inverse ManyToOne-Beziehung muss im Zielobjekt definiert sein), und das Quellobjekt muss das Attribut mappedBy verwenden Kartierung.

Lesen Sie weiter auf JPA Persistence und diese tutorial Spring

+0

verwenden sollte bearbeitet ich meinen Beitrag und hinzugefügt Frage und Antwort Modellklassen - ich @ManyToOne Anmerkungen dort verwenden. – foxbuur

3

Sie markiert sie als @Transient, die, je nachdem, welche Sie verwenden entweder bedeutet, dass es nicht serialisiert werden, oder nicht in der Datenbank gespeichert werden .Siehe this answer. Auch ohne Bezug Sie wahrscheinlich @ElementCollection(targetClass = String.class) auf diejenigen Lists