[英]Spring Data REST + JPA remove from OneToMany collection [not owner side]
目前,当我们尝试更新不是拥有方的集合(关系)时,我们在Spring Data JPA
+ Spring Data REST
( Hibernate
作为JPA
实现)方面遇到了一个问题(一个众所周知的问题)。
映射如下:
@Entity(name = Product.NAME)
public class Product {
...
@OneToMany(mappedBy = "baseProduct", fetch = FetchType.LAZY, targetEntity = Variant.class)
List<Variant> getVariants() {
...
在另一个变体方面:
@Entity(name = Variant.NAME)
public class Variant extends Product {
...
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Product.class)
@JoinColumn(name = "baseproduct_id", referencedColumnName = "id")
Product getBaseProduct() {
...
}
如果您仅使用Spring Data JPA
,那么在Java方面一切都很好,但是如果您想通过更新其变体集合来更新“产品”并将PATCH
请求发送到https://localhost:8112/storefront/rest/product/ 21394435410197232 仅包含新集合的有效负载(包含 3 个项目中的 2 个):
{"variants":["22801810293768080","22801810293768096"]}
我没有任何例外或任何事情,但由于拥有方是另一方,因此没有任何坚持,我又得到了旧的3 items
。
我know
我可以通过设置来解决这个问题
@JoinColumn(name = "baseproduct_id", referencedColumnName = "id")
两边都没有使用mappedBy
,但是我听说有一个性能影响,我不确定它有多大(我们有100多个实体有@OneToMany
),我想知道是否有更好的解决方法@PreUpdate
监听器或其他东西?
您必须同步双向关联的双方,并添加orphanRemoval
和Cascade
。
因此,您的映射变为:
@OneToMany(
mappedBy = "baseProduct",
fetch = FetchType.LAZY,
targetEntity = Variant.class
cascade = CascadeType.ALL,
orphanRemoval = true)
List<Variant> getVariants() {
以及两个添加/删除方法:
public void addVariant(Variant variant) {
getVariants().add(variant);
variant.setBaseProuct(this);
}
public void removeVariant(Variant variant) {
variant.setBaseProuct(null);
this.getVariants().remove(variant);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.