[英]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.