Hibernate @OneToMany FetchType.LAZY 不起作用

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

我有产品类别和所需产品库存列表 我从数据库获取产品时遇到问题

@Entity
public class Product {

@OneToMany(mappedBy =  "product",cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
    private List<RequiredStock> requiredStocks;

}

一旦我从产品存储库中调用 findAll 方法,就会立即获取RequiredStock

public List<Product> getAllProducts(){
        return productRepository.findAll();
    }

这是我从邮递员那里得到的回复

[
    {
        "id": 26,
        "requiredStocks": [
            {
                "id": 54,
                "amount": 5.0,
                "stock": {
                    "id": 1,
                    "stockName": "Sugar",
                    "quantity": 500.0,
                    "stockUnit": "GRAM",
                    "unitPrice": 25.0
                }
            }
        ],
    },
    {
        "id": 28,
        "requiredStocks": [
            {
                "id": 55,
                "amount": 2.0,
                "stock": {
                    "id": 1,
                    "stockName": "Sugar",
                    "quantity": 500.0,
                    "stockUnit": "GRAM",
                    "unitPrice": 25.0
                }
            }
        ],
       
    },
...

我不想从API获取RequiredStocks

spring-boot hibernate spring-data-jpa one-to-many
1个回答
0
投票

我认为这里的问题是对 LAZY 关系如何运作的误解。当关系被标记为 LAZY 时,当沿着主对象(在本例中为

Product
)时不会检索它,而是在访问属性时(当您调用
getRequiredStock
时。

所以,我猜您正在将

Product
映射到 dto 或从 API 返回
Products
,这会导致调用 getter 并触发关系查询。

在这种情况下,我建议避免映射

requiredStock
属性,或者使用不带
requiredStock
的自定义 dto 类忽略该属性。

这里有一个关于EAGER和LAZY差异的更详细的SO问题:Java Persistence API中FetchType LAZY和EAGER之间的区别?

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