Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 中间表上Jackson的无限递归_Java_Spring Boot_Hibernate_Jackson - Fatal编程技术网

Java 中间表上Jackson的无限递归

Java 中间表上Jackson的无限递归,java,spring-boot,hibernate,jackson,Java,Spring Boot,Hibernate,Jackson,我正在使用SpringBoot、Jackson和Hibernate创建一个API。Hibernate连接到MySQL数据库。 我了解良好的实践,但我在一个特定的点上被卡住了。 我有一个n:m关系,它包含一个额外的字段 例如:Author(id…)->write(idAuthor,idBook,date)当发生未处理的双向关系时,Jackson面临无限递归 我试图在编写的类上使用@JsonIgnore、@JsonManagedReference和@JsonBackReference 您需要分别使用

我正在使用SpringBoot、Jackson和Hibernate创建一个API。Hibernate连接到MySQL数据库。 我了解良好的实践,但我在一个特定的点上被卡住了。 我有一个n:m关系,它包含一个额外的字段


例如:Author(id…)->write(idAuthor,idBook,date)当发生未处理的双向关系时,Jackson面临无限递归

我试图在编写的类上使用@JsonIgnore、@JsonManagedReference和@JsonBackReference

您需要分别使用
@JsonManagedReference
@JsonBackReference
注释,以防止
书籍
书面
之间出现这些循环。附带说明,
transient
与持久性无关,只与序列化有关。JPA使用
@Transient
注释

public class Book implements Serializable {

    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Written> written= new HashSet<>();

    ...
}

重要提示:不要通过REST发送数据库实体(可能是您要做的)。更好地创建没有双向关系的DAO对象,并将实体映射到DAO中。有几个库可以做到这一点:我强烈推荐,不过这也是一种选择。如果这样的实体数量较少,那么使用构造函数/getter/setter就足够了。

哦,非常感谢你,但是繁殖行为并不完全符合预期。我现在可以检索这些书和它们的信息(不再有无限的递归错误),但没有作者的痕迹或书面文档中存储的其他字段。有什么建议吗?@nicoooo使用映射库只映射“第一”层的书籍,而不进一步引用作者。我事先表示歉意,但这是我在该领域的第一个应用程序,我不知道如何做这很好。为了简单起见,不要使用双向关系,除非您确实需要它们。有关实体到dto映射的更多信息,请在Google上搜索此术语:MapStruct entity to dto,您可以找到大量教程开始。类似问题:,
public class Book implements Serializable {

    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Written> written= new HashSet<>();

    ...
}
public class Written implements Serializable {

    @Id
    @ManyToOne
    @JoinColumn(name = "idBook")
    @JsonManagedReference
    private Book book;

    ...
}