Spring Data JPA:如何确保在保存主对象时嵌套的OneToMany对象是级联的?

hujrc8aj  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(148)

Spring Data JPA中嵌套对象的级联保存问题
我在使用Spring Data JPA时遇到了一个问题,该问题与OneToMany通信中嵌套对象的级联保存有关。当我尝试保存主实体(例如Product)时,相关实体(例如ProductVariant)不会自动保存。
以下是我的实体:

产品名称:

  1. @Entity
  2. @Table(name = "product")
  3. @Data
  4. public class Product {
  5. @Id
  6. @GeneratedValue(strategy=GenerationType.IDENTITY)
  7. @Column(name = "id", nullable = false)
  8. private Long id;
  9. @Column(name = "title", nullable = false)
  10. private String title;
  11. @Column(name = "handle", nullable = false, unique = true)
  12. private String handle;
  13. @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
  14. private List<ProductVariant> variants;
  15. @OneToMany(cascade = CascadeType.ALL)
  16. @JoinTable(
  17. name = "product_images",
  18. joinColumns = @JoinColumn(name = "product_id"),
  19. inverseJoinColumns = @JoinColumn(name = "image_id"))
  20. private List<Image> images;
  21. }

字符串

产品变量:

  1. @Entity
  2. @Table(name = "product_variant")
  3. @Data
  4. public class ProductVariant {
  5. @Id
  6. @GeneratedValue(strategy=GenerationType.IDENTITY)
  7. @Column(name = "id", nullable = false)
  8. private Long id;
  9. @Column(name = "name", nullable = false)
  10. private String name;
  11. @Column(name = "sku")
  12. private String sku;
  13. @ManyToOne
  14. @JoinColumn(name = "product_id")
  15. @JsonIgnore
  16. private Product product;
  17. }


如果详细描述了服务并手动添加了关系,则它可以正常工作:

  1. public Product createProduct(Product productRequest) {
  2. Product product = new Product();
  3. product.setTitle(productRequest.getTitle());
  4. product.setHandle(productRequest.getHandle());
  5. List<ProductVariant> variants = new ArrayList<>();
  6. if (productRequest.getVariants() != null) {
  7. for (ProductVariant variantRequest : productRequest.getVariants()) {
  8. ProductVariant variant = new ProductVariant();
  9. variant.setName(variantRequest.getName());
  10. variant.setSku(variantRequest.getSku());
  11. variant.setProduct(product);
  12. variants.add(variant);
  13. }
  14. }
  15. List<Image> images = new ArrayList<>();
  16. if (productRequest.getImages() != null) {
  17. for (Image imageRequest : productRequest.getImages()) {
  18. Image image = new Image();
  19. image.setName(imageRequest.getName());
  20. image.setAlt(imageRequest.getAlt());
  21. image.setUrl(imageRequest.getUrl());
  22. images.add(image);
  23. }
  24. }
  25. product.setVariants(variants);
  26. product.setImages(images);
  27. return productRepository.save(product);
  28. }


但在一个好的方式,它应该这样自动工作,或者我误解了什么?

  1. public Product createProduct(Product productRequest) {
  2. return productRepository.save(productRequest);
  3. }


我想指出的是,在这两种情况下,当我通过Postman发送请求时,我会得到一个包含变量的响应,但是如果我有第二个示例中的服务,在数据库中查找变量的product_id并没有指定

mzillmmw

mzillmmw1#

解决了我的问题,也许别人会:

  1. @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
  2. @JsonManagedReference
  3. private List<ProductVariant> variants;
  4. @ManyToOne(cascade = CascadeType.ALL)
  5. @JoinColumn(name = "product_id")
  6. @JsonBackReference
  7. private Product product;

字符串
我们需要添加两个注解@JsonBackReference和@JsonManagedReference,它可以工作

相关问题