使用尚未持久化的对象

时间:2015-01-08 16:32:43

标签: hibernate spring-mvc file-upload

我正在开发一个Spring-MVC项目。在项目中,我有2个表ProductBasic和ProductImage。用户应该能够在ProductImage表中上传最多5个图像。 ProductImage表具有对ProductBasic的外键引用。

问题:用户输入产品信息并在同一个JSP页面上传产品。如果ProductBasic尚未保留,如何保存productImages?

我正在粘贴一些代码,请看看

ProductController:

@RequestMapping(value="/product/add",method = RequestMethod.POST)
    public String addProduct(@ModelAttribute("product") ProductBasic productBasic,Model model){
        User user = userService.getCurrentlyAuthenticatedUser();
        model.addAttribute("product", new ProductBasic());
        productBasic.setProductimage(productprofileimage);
        productBasicService.addProduct(user,productBasic);
        productprofileimage =null;
        return "redirect:/product/show";
    }

上述方法只添加一个图像,而不是在ProductImage表中,因此它可以工作。

ProductBasic模型:

@Entity
@Table(name = "product")
public class ProductBasic {
 @OneToMany(mappedBy = "uploadinguser",fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
    private Set<ProductImage> productImageSet = new HashSet<>();

    public Set<ProductImage> getProductImageSet(){return this.productImageSet;}

    public void setProductImageSet(Set<ProductImage> productImageSet){this.productImageSet=productImageSet;}
}

ProductImage模型:

@Entity
@Table(name = "productimages")
public class ProductImage {

 @Transient
    private List<MultipartFile> productImages;

    @ManyToOne
    @JoinColumn(name = "id")
    private ProductBasic productimageupload;

    public ProductBasic getProductimageupload(){return this.productimageupload;}

    public void setProductimageupload(ProductBasic productimageupload){this.productimageupload=productimageupload;}

}

如果需要澄清,请告诉我。欢迎任何建议。谢谢。

1 个答案:

答案 0 :(得分:1)

只需改变一下:

@OneToMany(mappedBy = "uploadinguser",fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)

到此:

@OneToMany(mappedBy = "uploadinguser",fetch = FetchType.EAGER,cascade = CascadeType.ALL)

使用cascade = CascadeType.ALL也会自动级联持久化和合并操作。因此,您可以保存ProductBasic根实体,同时也会保存图像。

请确保您也设置了关联的两面:

ProductBasic productBasic = ...;

ProductImage image1 = new ProductImage();
productBasic.getProductImageSet().add(image1);
image1.setProductimageupload(productBasic);

ProductImage image2 = new ProductImage();
productBasic.getProductImageSet().add(image2);
image2.setProductimageupload(productBasic);