Java 中间表上Jackson的无限递归
我正在使用SpringBoot、Jackson和Hibernate创建一个API。Hibernate连接到MySQL数据库。 我了解良好的实践,但我在一个特定的点上被卡住了。 我有一个n:m关系,它包含一个额外的字段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 您需要分别使用
例如: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;
...
}