jpa Spring图像上传@onetoonemapping

nukf8bse  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(190)

当我上传一个图像时,我得到一个image_id,当我使用该id上传产品时,上传成功,但product表中的image_id字段为空。
我已经提供了下面的代码,如果你无法重现这个问题,你可以在这里找到代码https://github.com/My-Portfolio-Projects/FoodBox.git
这是产品实体

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "products", schema = "foodbox")
public class Product {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "product_id")
    private int productId;
    @Basic
    @Column(name = "name")
    private String name;
    @Basic
    @Column(name = "description")
    private String description;
    @Basic
    @Column(name = "price")
    private BigDecimal price;
    @Basic
    @Column(name = "quantity_in_stock")
    private int quantityInStock;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "image_id", referencedColumnName = "image_id")
    private Image image;
    
    
}

字符串
这是图像实体

@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "images", schema = "foodbox")
public class Image {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "image_id", nullable = false)
    private Integer id;

    @Column(name = "image_name", nullable = false)
    private String name;

    @Lob
    @Column(name = "image_data", nullable = false)
    private byte[] imageData;

    public Image(String name, byte[] data) {
        this.name = name;
        this.imageData = data;
    }

   

}


这是上传图像的控制器逻辑,它可以工作

//Part of ImageController.java
@PostMapping(value = "/image",consumes = MediaType.MULTIPART_FORM_DATA_VALUE )
   public ResponseEntity<Integer> createImage(@RequestPart("image") MultipartFile data) throws IOException {
       String name = data.getOriginalFilename();
       Image image = imageService.createImage(name, data.getBytes());
       return ResponseEntity.ok(image.getId());
       }

//Part of ImageService.java
public Image createImage(String name,byte[] data)  {
       
   Image image = new Image(name,data);
   return this.imageRepository.save(image);
   }

//Part of ImageRepository

   Image save(Image image);


这是控制器的逻辑上传一个新的产品,这也工程

//Part of ProductController.java
 @PostMapping(value="/products")
    public Product createProduct(@RequestBody Product product) {
        return productService.createProduct(product);
    }

//Part of ProductService.java
 public Product createProduct(Product product) {
        return productRepository.save(product);
    }

//Part of ProductRepository which extends CrudRepository
 @Override
    Product save(Product product);

57hvy0tb

57hvy0tb1#

有多个不正确的,不是最佳做法在你的代码。

  • 不要使用两种不同的id类型。在你的例子中你使用了int和int。
  • 不要使用CascadeType.ALL,如果你不需要它。对于你试图实现的,你根本不需要它。
  • 使用统一的变量名。如果Product有字段id,则使用columnName id。对Image也这样做。

对于您的示例,这是工作对象和方法:

@Entity
@Table(name = "product")
@Getter
@Setter
public class Product extends IdAbstraction {
  @OneToOne
  @JoinColumn(name = "image_id")
  private Image image;
}

@Entity
@Table(name = "image")
@Getter
@Setter
public class Image extends IdAbstraction {
  @Column(name = "data")
  private byte[] data;
}

public Product createProduct(@RequestBody Product product) {
  return productRepository.save(product);
}

public Image createImage(@RequestBody Image image) {
  return imageRepository.save(image);
}

字符串
首先调用WebImage。然后从响应中获取创建的图像的id,并将其放入WebProduct的@RequestBody中。因此WebProduct请求体应该如下所示:

{
    "image": {
        "id": "xxxxxxxx"
    }
}


编辑-01:你也不需要覆盖仓库的保存方法。如果可能的话,只要使用默认的方法。你可以像在你的例子productRepository.save(entity);中那样调用它们,而不需要覆盖任何东西。

public interface ProductRepository extends JpaRepository<Product, String> {}

相关问题