繁体   English   中英

Spring Data REST + JPA 从 OneToMany 集合中删除 [不是所有者方面]

[英]Spring Data REST + JPA remove from OneToMany collection [not owner side]

目前,当我们尝试更新不是拥有方的集合(关系)时,我们在Spring Data JPA + Spring Data RESTHibernate作为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监听器或其他东西?

您必须同步双向关联的双方,并添加orphanRemovalCascade

因此,您的映射变为:

@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);
}

您需要在Variant子实体中实现equalshashCode方法,以便addremove方法有效工作。

暂无
暂无

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

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