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

hujrc8aj  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(46)

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并没有指定

mzillmmw

mzillmmw1#

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

@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,它可以工作

相关问题