有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Jackson从列表到Json无限循环

我有两张桌子的问题和答案。问题表2中的字段id和问题。在答案4字段中,id、QuestionID为FK to Question、Answer和isCorrect。很简单,一个女人

我在这个表上创建了两个实体。HQL查询之后

from Question

当我尝试从列表转换为Json时,我收到无限循环。使用jackson和annotate@JsonIgnore,没有帮助。还添加了@JsonManagedReference和@JsonBackReference,同样的问题

问题:

CREATE TABLE `question` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT,
    `Question` VARCHAR(200) NOT NULL,
    PRIMARY KEY (`ID`)
)

回答

CREATE TABLE `answer` (
    `ID` INT(10) NOT NULL AUTO_INCREMENT,
    `QuestionID` INT(11) NOT NULL,
    `Answer` VARCHAR(50) NOT NULL,
    `IsCorrect` TINYINT(1) NULL DEFAULT '0',
    PRIMARY KEY (`ID`),
    INDEX `FK_Question` (`QuestionID`),
    CONSTRAINT `FK_Question` FOREIGN KEY (`QuestionID`) REFERENCES `question` (`ID`)
)

实体

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

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String question;

    @JsonManagedReference("question-answers")
    @OneToMany(mappedBy="question")
    private List<Answer> answers;
    .....getters/setters
    @Override
    public String toString() {
        return "Question [id=" + id + ", question=" + question + ", answers="
                + answers + "]";
    }

应答实体

@Entity
public class Answer{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
//  @GeneratedValue
    private int id;

    private String answer;

    private byte isCorrect;

    @ManyToOne(optional = false)
    @JoinColumn(name="QuestionID")
    @JsonBackReference("question-answer")
    private Question question;
    .....getters/setters
    @Override
    public String toString() {
        return "Answer {id:" + id + ", answer:" + answer + ", isCorrect:"
                + isCorrect +  "}";
    }

康罗尔

@RequestMapping("/home")
    @JsonIgnore
    public @ResponseBody List<Question> home(){
        List<Question> qu = questionService.getQuestion();
        return qu;
    }

如何正确创建表或如何正确创建实体?也许还有别的错误

谢谢


共 (1) 个答案

  1. # 1 楼答案

    还添加了@JsonManagedReference和@JsonBackReference,同样的问题让我惊讶

    可以使用@JsonIdentityInfoJackson为它序列化的每个对象分配ID。如果其中一个对象再次出现,它将使用之前分配的id来引用它

    为你的课程添加注释

    @Entity
    @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
    public class Answer { ... }
    

    你可以使用很多ObjectIdGenerators