我有产品和类别实体。它们之间有ManyToMany关系,而Product是关系所有者,因此当我调用操作来创建/保存Product(例如,类别1和类别2)时,将调用两个查询:
这是预期的行为。
但是,当我添加/删除类别并尝试调用update(从db获取产品,设置新值并再次调用save)时,将调用以下两个查询:
我的目标是仅更新“产品”表,并更新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)中的记录保持最新状态?