使用Jackson从List到Json infinity循环

时间:2013-09-05 15:30:28

标签: java sql hibernate spring-mvc entity

我有2个表问答。在问题表2中的字段id和问题。在答案4字段中,id,QuestionID为FK to Question,answer和isCorrect。很容易2关系OneToMany。

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

  

来自问题

我尝试从List转换为Json时收到无限循环。使用jackson并注释@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;
    }

如何正确创建表或如何正确创建实体?也许还有其他一些错误。

THX!

1 个答案:

答案 0 :(得分:0)

这个还添加@JsonManagedReference和@JsonBackReference,同样的问题让我感到惊讶。

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

为您的课程添加注释

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

您可以使用许多ObjectIdGenerators