@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<Orders>
而不是Set<Orders>
。
请注意documentation中提到的:
然而,尽管
@BatchSize
比遇到 N+1 查询问题要好,但大多数时候,DTO 投影或JOIN FETCH
是更好的选择,因为它允许您使用一个查询。
【讨论】:
【参考方案2】:您的 N + 1 查询问题是由于您在 Order
中急切地获取 Item
。在那里更改为 LAZY,你应该很高兴。
【讨论】:
也尝试过懒惰,但问题仍然存在 请添加生成的查询,以便我们查看实际发生的情况。以上是关于@Batchsize 注释不适用于 OneToMany的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data JPA 审计不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为啥?