@Batchsize 注释不适用于 OneToMany

Posted

技术标签:

【中文标题】@Batchsize 注释不适用于 OneToMany【英文标题】:@Batchsize annotation not working for 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 个查询的实施错误是什么?

【问题讨论】:

【参考方案1】:

    尝试使用List&lt;Orders&gt; 而不是Set&lt;Orders&gt;

    请注意documentation中提到的:

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

【讨论】:

【参考方案2】:

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

【讨论】:

也尝试过懒惰,但问题仍然存在 请添加生成的查询,以便我们查看实际发生的情况。

以上是关于@Batchsize 注释不适用于 OneToMany的主要内容,如果未能解决你的问题,请参考以下文章

存储库注释不适用于 Spring 数据 JPA

Shiro 注释不适用于 JavaEE6 项目

Spring Data JPA 审计不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为啥?

通过注释的 Spring 授权不适用于自定义身份验证

Symfony Doctrine 验证不适用于可嵌入的注释

JSF 注释不适用于 Spring-boot