首页 > 解决方案 > JSON 中不存在 @OneToMany 列

问题描述

我有以下实体:

图书.java

@Entity @Data
public class Book {

    @Id
    private Long id;

    @Column(unique = true, nullable = false)
    private String title;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "book")
    @JsonManagedReference
    private List<Note> notes;

}

Note.java

@Entity @Data
public class Note {

    @Id
    private Long id;

    @Column(nullable = false)
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "book_id", nullable = false)
    @JsonBackReference
    private Book book;

}

当我调用BookRestController时,它会返回一个 JSON,其中包含我需要的所有属性:

{
    "id": 15,
    "title": "A fé explicada",
    "author": "Leo J. Trese",
    "notes": [{
        "id": 10,
        "title": "Sobre o pecado mortal"
    }]
}

但是当我调用NoteRestController时,缺少Book属性:

{
   "id": 10,
   "title": "Sobre o pecado mortal"
   // missing "book" property here...
}

我究竟做错了什么?

我正在使用@OneToMany@ManyToOne注释来声明它是一个 1-N 关系;@JsonBackReference@JsonManagedReference具有避免无限递归的简单目的。

标签: javajsonspringjpaentity-relationship

解决方案


当然Book被省略了,这就是字面上@JsonBackReference的意思

@JsonBackReference 是引用的后面部分——它将从序列化中省略。

https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

解决方案就像听起来一样简单:Note您可以创建而不是在 REST 控制器中返回一个实体(无论如何我尽量避免将实体保留为在 REST 上下文中没有任何用途的实体)一个名为 eg 的显式传输对象NoteDTO,其中包含对一本书的引用(省略了书中的注释以不具有无限递归):

public class NoteDTO {

    private Long id;
    private String title;
    private BookReferenceDTO book;

    // getters and setters
}
public class BookReferenceDTO {

    private Long id;
    private String title;

    // getters and setters
}

推荐阅读