当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SpringDataREST+JPA从OneToMany集合中删除[不是所有者方]》经验,为你挑选了1个好方法。

目前,我们在尝试更新集合(关系)时遇到了一个问题(一个众所周知的问题)和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 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() {
...
}

如果您只使用Java,那么在Java方面一切都很好,但是如果您想通过更新其变体集合来更新"产品"并将请求发送到包含有效负载的https:// localhost:8112/storefront/rest/product/21394435410197232仅限新系列(3项中有2项):Spring Data JPAPATCH

{"variants":["22801810293768080","22801810293768096"]}

我没有例外或任何事情,但由于拥有方是另一方没有任何东西是坚持的,我3 items再次得到旧的.

know可以通过设置来解决这个问题

@JoinColumn(name = "baseproduct_id", referencedColumnName = "id")

两侧,并且不使用mappedBy任何地方,但我听说有哪个我不知道这是多么大的一个表现暗示(我们得到了有100多个实体@OneToMany),我不知道有没有通过更好的解决办法@PreUpdate听众还是什么?



1> Vlad Mihalce..:

如本文所述,您必须同步双向关联的两端,并添加orphanRemoval和Cascade.

所以,你的映射成为:

@OneToMany(
    mappedBy = "baseProduct", 
    fetch = FetchType.LAZY, 
    targetEntity = Variant.class
    cascade = CascadeType.ALL, 
    orphanRemoval = true)
List getVariants() {

并且两个添加/删除方法:

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,如本文中的解释.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有