在Spring-Data-JPA中简化POST请求

q3aa0525  于 2023-04-20  发布在  Spring
关注(0)|答案(3)|浏览(134)

目前正在编写一个使用REST APISpring bootdata-jpasecuritymysql的食品管理系统。
我有实体类ProductCategory,它们之间有一对多的关系。一切正常,但是因为在Product类中我有Category类型的类别字段,我必须在POST方法中输入整个类别对象(/products/add).我的问题是我如何才能使它有可能只输入categoryId,以便在数据库中创建新的产品实体.如果我使用DTO,通过只发送categoryId,它将填充categoryName字段也?(因为如果我不手动,类别出现空).

@Data
@Embeddable
@Entity
@Table(name = "products")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer productId;
    private String productName;
    private double price;
    private String filePath;

    @ManyToOne
    @JoinColumn(name="category_id")
    private Category category;
    
}
@Data
@Entity
public class Category {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer categoryId;
    private String categoryName;
    
    @JsonIgnore
    @OneToMany(mappedBy = "category")
    private List<Product> productList;

}

我尝试了不同的cascadefetching类型,其中一些类型出现了很多错误。仍然是同样的情况。在我看来,应该有一种方法可以通过修改实体之间的关系来实现这一点。

6ovsh4lw

6ovsh4lw1#

在持久化产品时,您不需要填充Category,也不需要在持久化产品之前使用select获取它。* 您可以获取类别的引用,并在Product实体中提供它并持久化它。* 此外,我建议为@ManyToOne as Lazy定义获取策略

Category category = categoryRepository.getReferenceById(1L);

productRepository.save(
    new Product()
        .setId(1L)
        .setProductName("Soul stone")
        .setCategory(category)
);
tag5nh1u

tag5nh1u2#

更新:解决方案。需要使用DTO与ModelMapper。在ProductD中使用categoryName创建字段名称。但它应该与Category实体类中的categoryName字段相同。ModelMapper会自动将这些Map到字段。所以我可以只获取和添加categoryName而无需填充整个Category对象。

qij5mzcb

qij5mzcb3#

首先,您必须在数据库中创建具有不同ID的产品类别。当您发布产品时,您必须在JSON文件中显示categoryId。为findById创建存储库类后,如果类别不存在,则无法执行此操作。因此,在新数据库中添加类别后,您可以通过仅发送类别ID来发布产品。顺便说一下,请尝试发送DTO而不是实体。

{
    "productName": "product01",
    "price": 24.6,
    "filePath": ----,
    "category": 2 
}

相关问题