当我有ManyToMany关系(spring-boot / spring-data-jpa)时,如何更新子实体列表?

时间:2019-02-16 16:47:44

标签: java spring spring-boot spring-data-jpa

我有产品和类别实体。它们之间有ManyToMany关系,而Product是关系所有者,因此当我调用操作来创建/保存Product(例如,类别1和类别2)时,将调用两个查询:

  1. 插入产品...
  2. 插入ProductCategory ...

这是预期的行为。

但是,当我添加/删除类别并尝试调用update(从db获取产品,设置新值并再次调用save)时,将调用以下两个查询:

  1. 更新产品...
  2. 更新类别...

我的目标是仅更新“产品”表,并更新JOIN TABLE(“ ProductCategory”)。

以下是相关的域类:

@Entity
@Data
@Table(name = "products")
@EqualsAndHashCode(callSuper = false)
public class Product extends BaseEntityAudit {

@NotEmpty
@Column(name = "name")
private String name;

@Column(name = "description")
private String description;

@NotEmpty
@Column(name = "code")
private String code;

@NotNull
@Column(name = "price")
private Double price;

@Column(name = "published", nullable = true)
private boolean published;

@OneToMany(mappedBy = "product")
private List<Order> orders;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ecommerce_id", nullable = false)
private ECommerce eCommerce;

@ManyToMany(fetch = FetchType.LAZY,
        cascade = { CascadeType.MERGE, CascadeType.REFRESH })
@JoinTable(
        name = "CategoryProduct",
        joinColumns = { @JoinColumn(name = "product_id") },
        inverseJoinColumns = { @JoinColumn(name = "category_id") }
)
private List<Category> categories;
}

@Entity
@Data
@Table(name = "categories")
@EqualsAndHashCode(callSuper = false)
public class Category extends BaseEntityAudit {

@Column(name = "name")
private String name;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ecommerce_id", nullable = false)
private ECommerce eCommerce;

@ManyToMany(mappedBy = "categories",
            cascade = { CascadeType.MERGE, CascadeType.REFRESH } )

private List<Product> products;
}

这是处理更新请求的服务方法:

@Override
public ProductResponse update(CreateUpdateProductRequest request,
                        String productId) throws ProductNotFoundException {
    Product product = productRepository.getOne(Long.valueOf(productId));

    productTransformer.productRequestToProduct(request, product);
    return productTransformer.productToProductResponse(
        productRepository.save(product));
}

并将CreateUpdateProductRequest发送到产品转换器:

public void productRequestToProduct(CreateUpdateProductRequest request, 
Product product) {
    ECommerce eCommerce = new ECommerce();
    eCommerce.setId(Long.valueOf(request.getECommerceId()));
    product.setName(request.getName());
    product.setDescription(request.getDescription());
    product.setCode(request.getCode());
    product.setPrice(request.getPrice());

    product.setCategories(
        categoriesRequestToDomain(request.getCategoryIds()
    ));
    product.setECommerce(eCommerce);
}

我该怎么做才能仅使用spring-data-jpa的功能来使JOIN TABLE(ProductCategory)中的记录保持最新状态?

0 个答案:

没有答案