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

问题描述 投票:0回答:1

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

java spring hibernate spring-data-jpa spring-data
1个回答
0
投票

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

@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 并且它有效

© www.soinside.com 2019 - 2024. All rights reserved.