目前,我们在尝试更新集合(关系)时遇到了一个问题(一个众所周知的问题)和Spring Data JPA
+ Spring Data REST
(Hibernate
作为JPA
实现),这是一个非拥有方.
映射如下:
@Entity(name = Product.NAME) public class Product { ... @OneToMany(mappedBy = "baseProduct", fetch = FetchType.LAZY, targetEntity = Variant.class) ListgetVariants() { ...
在另一个变体方面:
@Entity(name = Variant.NAME) public class Variant extends Product { ... @ManyToOne(fetch = FetchType.LAZY, targetEntity = Product.class) @JoinColumn(name = "baseproduct_id", referencedColumnName = "id") Product getBaseProduct() { ... }
如果您只使用Java,那么在Java方面一切都很好,但是如果您想通过更新其变体集合来更新"产品"并将请求发送到包含有效负载的https:// localhost:8112/storefront/rest/product/21394435410197232仅限新系列(3项中有2项):Spring Data JPA
PATCH
{"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) ListgetVariants() {
并且两个添加/删除方法:
public void addVariant(Variant variant) { getVariants().add(variant); variant.setBaseProuct(this); } public void removeVariant(Variant variant) { variant.setBaseProuct(null); this.getVariants().remove(variant); }
要使remove方法正常工作,您需要实现equals和hashCode,如本文中的解释.