【问题标题】:@Batchsize annotation not working for OneToMany@Batchsize 注释不适用于 OneToMany
【发布时间】:2021-06-03 22:06:57
【问题描述】:

我有以下类,在注释 @BatchSize 注释时它不起作用,我得到 n+1 选择查询。

Class Shipment{
 @OneToMany(fetch = FetchType.LAZY, mappedBy = order.shipment, cascade = CascadeType.ALL, 
 orphanRemoval = true)
 @BatchSize(size=20)
 Set<Orders> orders = new Hashset(); <---- Batch size annotation not working 
 }

订单类

class Order{
 @ToString.Exclude
 @ManyToOne
 @JoinColumn(name = "item_fk")
 Item item;

 @ToString.Exclude
 @ManyToOne
 @JoinColumn(name = "shipment_fk")
 Shipment shipment; }

Item.class

class Item{
 String id;
 String name;
}

我收到 n+1 个查询的实施错误是什么?

【问题讨论】:

    标签: spring-boot hibernate jpa orm hibernate-mapping


    【解决方案1】:
    1. 尝试使用List&lt;Orders&gt; 而不是Set&lt;Orders&gt;

    2. 请注意documentation中提到的:

    然而,尽管@BatchSize 比遇到 N+1 查询问题要好,但大多数时候,DTO 投影或JOIN FETCH 是更好的选择,因为它允许您使用一个查询。

    【讨论】:

      【解决方案2】:

      您的 N + 1 查询问题是由于您在 Order 中急切地获取 Item。在那里更改为 LAZY,你应该很高兴。

      【讨论】:

      • 也尝试过懒惰,但问题仍然存在
      • 请添加生成的查询,以便我们查看实际发生的情况。
      猜你喜欢
      • 2013-09-20
      • 2020-11-19
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多