当我使用一对一映射时,同一输出会重复很多次

时间:2019-07-05 05:55:29

标签: spring-boot-jpa

我刚刚开始学习spring-boot-jpa。     我尝试在程序中使用一对一映射,当我使用Getmapping获取输出时,相同的数据重复多次。     我不确定代码有什么问题。

一对一的父母关系

@OneToOne(mappedBy = "question", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Options options;

一对一的孩子关系

@OneToOne (cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "questionId")
    private Question question;

下面是控制器类

@RestController
public class QuizController {
    List<Question> question = new ArrayList<Question>();

    @Autowired
    QuestionRepo questionRepo;


    @Autowired
    OptionsRepo optionsRepo;

    @GetMapping("/question")
    public List<Question> getQues() {
         return questionRepo.findAll();
    }


    @PostMapping("/question")
    public void setQues(@RequestParam String ques, String choice1, String choice2, String choice3, String choice4) {
        Question setQues = new Question();
        setQues.setQuestion(ques);
        Options setOp = new Options();
        setOp.setOption1(choice1);
        setOp.setOption2(choice2);
        setOp.setOption3(choice3);
        setOp.setOption4(choice4);

        setQues.setOptions(setOp);
        setOp.setQuestion(setQues);
        questionRepo.save(setQues);

这是我得到的输出,相同的选项重复多次,

[{"questionId":1,"options":{"option1":"Red","option2":"Black","option3":"Yellow","option4":"Green","question":{"questionId":1,"options":{"option1":"Red","option2":"Black","option3":"Yellow","option4":"Green"}]

2 个答案:

答案 0 :(得分:0)

尝试遵循具有子关系的代码

@OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "Child columnname", referencedColumnName = "parent columnname")

尝试通过父级关系遵循代码

@OneToOne(mappedBy = "childrefrence ", cascade = CascadeType.ALL, fetch = FetchType.EAGER)

答案 1 :(得分:0)

您的映射存在问题。设计双向映射时,应有一侧是关系的拥有侧,另一侧是映射侧。您不应在双方中都使用@OneToOne,而应在一侧使用mapping by。按照this answer来更正您的映射

也要解决无限递归问题,请在一侧使用@JsonManagedReference @JsonBackReference告诉您的序列化程序(默认为杰克逊)在序列化对象时忽略一侧。