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并没有指定
1条答案
按热度按时间mzillmmw1#
解决了我的问题,也许别人会:
字符串
我们需要添加两个注解@JsonBackReference和@JsonManagedReference,它可以工作