0

我有一个 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;
    }

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

谢谢!

4

1 回答 1

0

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

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

注释你的类

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

有很多ObjectIdGenerators你可以使用。

于 2013-09-05T15:32:30.057 回答