Spring Data JPA 中嵌套对象级联保存的问题
我在使用 Spring Data JPA 时遇到了一个与 OneToMany 通信中嵌套对象的级联保存相关的问题。当我尝试保存主要实体(例如 Product)时,相关实体(例如 ProductVariant )不会自动保存。
这是我的实体:
产品:
@Entity
@Table(name = "product")
@Data
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "handle", nullable = false, unique = true)
private String handle;
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ProductVariant> variants;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "product_images",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "image_id"))
private List<Image> images;
}
产品变体:
@Entity
@Table(name = "product_variant")
@Data
public class ProductVariant {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "sku")
private String sku;
@ManyToOne
@JoinColumn(name = "product_id")
@JsonIgnore
private Product product;
}
如果详细描述了服务并手动添加了关系,则它可以正常工作:
public Product createProduct(Product productRequest) {
Product product = new Product();
product.setTitle(productRequest.getTitle());
product.setHandle(productRequest.getHandle());
List<ProductVariant> variants = new ArrayList<>();
if (productRequest.getVariants() != null) {
for (ProductVariant variantRequest : productRequest.getVariants()) {
ProductVariant variant = new ProductVariant();
variant.setName(variantRequest.getName());
variant.setSku(variantRequest.getSku());
variant.setProduct(product);
variants.add(variant);
}
}
List<Image> images = new ArrayList<>();
if (productRequest.getImages() != null) {
for (Image imageRequest : productRequest.getImages()) {
Image image = new Image();
image.setName(imageRequest.getName());
image.setAlt(imageRequest.getAlt());
image.setUrl(imageRequest.getUrl());
images.add(image);
}
}
product.setVariants(variants);
product.setImages(images);
return productRepository.save(product);
}
但以一种好的方式,它也应该自动以这种方式工作,还是我误解了什么?
public Product createProduct(Product productRequest) {
return productRepository.save(productRequest);
}
我想指出,在这两种情况下,当我通过 Postman 发送请求时,我会收到包含变体的响应,但如果我在第二个示例中提供服务,则在数据库中查找未指定变体的 Product_id
解决了我的问题,也许其他人会:
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private List<ProductVariant> variants;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "product_id")
@JsonBackReference
private Product product;
我们需要添加两个注释 @JsonBackReference 和 @JsonManagedReference 并且它有效