使用尚未持久化的对象
Using a object which is not already persisted
我正在开发一个 Spring-MVC 项目。在项目中,我有 2 tables ProductBasic 和 ProductImage。用户应该能够在 ProductImage table 中上传最多 5 张图像。
ProductImage table 具有对 ProductBasic 的外键引用。
问题:用户在同一 JSP 页面上输入产品信息并上传产品图片。如果 ProductBasic 尚未保留,我如何保存 productImages?
我正在粘贴一些代码,请看一下
产品控制器:
@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中table,所以可以。
产品基本型号:
@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;}
}
产品图片模型:
@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;}
}
如果需要任何说明,请告诉我。欢迎提出任何建议。谢谢你。
只需更改此:
@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);
我正在开发一个 Spring-MVC 项目。在项目中,我有 2 tables ProductBasic 和 ProductImage。用户应该能够在 ProductImage table 中上传最多 5 张图像。 ProductImage table 具有对 ProductBasic 的外键引用。
问题:用户在同一 JSP 页面上输入产品信息并上传产品图片。如果 ProductBasic 尚未保留,我如何保存 productImages?
我正在粘贴一些代码,请看一下
产品控制器:
@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中table,所以可以。
产品基本型号:
@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;}
}
产品图片模型:
@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;}
}
如果需要任何说明,请告诉我。欢迎提出任何建议。谢谢你。
只需更改此:
@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);