Spring Boot中将对象序列化为JSON时出现循环问题

问题描述 投票:0回答:1

我使用 Spring Boot 3.2 版本和 MySQL 数据库。我有两个对象

@Getter
@Setter
@Entity
@Table(name = "shops")
public class Shop{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String address;
    @OneToMany(mappedBy = "shop", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Book> books;
}

@Getter
@Setter
@Entity
@Table(name = "books")
public class Book{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "shop_id")
    private Shop shop;
}

所以当我试图获取所有商店的所有书籍时,我遇到了一些丢失问题。我有一个对象商店,其中包含所有书籍对象,每本书都有自己的商店对象,包含所有书籍等。它看起来像

[
    {
        "id": 4,
        "address": "Street",
        "books": [
                {
                "id": 3,
                "description": "Book1",
                "shop" : {
                       "id": 4,
                       "address": "Street"
                       "books": [
                               {
                                "id": 3,
                                "description": "Book1",
                                "shop" : { ...
                               }
                       ]
                }
        ]
     }
]

所以问题是我想使用一个类来保存商店/书籍并从数据库获取。 然后我需要该商店将所有书籍作为具有所有数据的对象,但书籍只有 shopId。 所以获取所有商店应该是这样的

[
    {
        "id": 4,
        "address": "Street",
        "books": [
                {
                "id": 3,
                "description": "Book1",
                "shop" : 4
                }
         ]
     }
]

获取所有书籍都应该是这样的

[
    {
        "id": 3,
        "description": "Book1",
        "shop": 4
    },
    {
        "id": 4,
        "description": "Book2",
        "shop": 5
    },
    {
        "id": 5,
        "description": "Book4",
        "shop": 5
    },
]

正如我所说,我想使用相同的类来保存商店/书籍,并使用相同的类来获取。 我面临几个问题。

  1. 我不想创建额外的 ShopDTO/BookDTO 对象来获取,因为如果它是 1M 本书,那么我每次获取时都需要创建 1M 对象。
  2. 我无法再添加一个变量,例如 Long shopId;因为这会是休眠错误 表 [books] 包含由多个逻辑列名称引用的物理列名称 [shop_id]:[shop_id]、[shopId]
  3. 我无法改变
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "shop_id")
private Shop shop; 

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "shop_id")
private Long shop;

或完全删除@ManyToOne。

java json spring hibernate
1个回答
0
投票

@Entity
@Table(name = "shops")
public class Shop {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String address;

}

@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "shop_id")
    private Shop shop;

}

SELECT s.id, s.address, b.id AS bookId
FROM shops s
LEFT JOIN books b ON s.id = b.shop_id;

© www.soinside.com 2019 - 2024. All rights reserved.