【问题标题】:From List to Json infinity loop with using Jackson使用 Jackson 从 List 到 Json 无限循环
【发布时间】:2013-09-05 15:30:28
【问题描述】:

我有 2 个表问题和答案。在问题表 2 中的字段 id 和 question。在 Answer 4 字段中,id、QuestionID 为 Question、answer 和 isCorrect 的 FK。非常简单的 2 关系 OneToMany。

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

来自问题

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

如何正确创建表或如何正确创建实体?可能还有其他错误。

谢谢!

【问题讨论】:

    标签: java sql hibernate spring-mvc entity


    【解决方案1】:

    这个还加了@JsonManagedReference 和@JsonBackReference,同样的问题让我吃惊。

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

    注释你的类

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

    你可以使用很多ObjectIdGenerators

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2013-06-16
      • 2020-12-07
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多