繁体   English   中英

当我删除@OneToMany 关系中的实体时,Hibernate,n+1 查询

[英]Hibernate, n+1 queries when i delete an entity in a @OneToMany relation

我想定义一个双向@OneToMany 关系。 我是通过以下方式做到的:

public class Customer {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
  @JsonIgnore
  @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
  private List<CustomerEmployeeRole> roles;

  // more fields
}

public class CustomerEmployeeRole {

  @ManyToOne
  @NotNull
  private Customer customer;

 // more fields
}

一切都按预期进行,唯一的问题是当我删除客户时执行了 n+1 个查询。 n 是客户拥有的角色数。 对于每个角色,执行以下查询:

delete from customer_employee_role where id=?

可以在一个查询中删除所有角色:

delete from customer_employee_role where customer_id=?

我假设 hibernate 由于mappedBy = "customer"而执行 n+1 个查询。 我想保留注释,因为我想避免连接表。 在这种情况下,有什么方法可以告诉 hibernate 只执行一个查询而不是 n 个查询? 否则我将不得不编写自己的查询,这也可以工作,但它并不是很优雅。

n+1查询是因为CascadeType.ALL 因为您设置了这个属性,所以 CustomerEmployeeRole 也被删除了。 因此,如果您想删除客户,让我们看看假设客户有 2 个角色会发生什么:

1) 从 CustomerEmployeeRole 中删除 id =..

2) 从 CustomerEmployeeRole 中删除 id =..

3) 从客户中删除 id =..这是您的+1查询。

PS:如果您对映射@OneToMany@ManyToMany@OneToOne的最佳方式或幕后发生的事情有任何疑问, 是一个很好的教程。 (其他注解也一样)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM