目前正在编写一个使用REST API
、Spring boot
、data-jpa
、security
和mysql
的食品管理系统。
我有实体类Product
和Category
,它们之间有一对多的关系。一切正常,但是因为在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;
}
我尝试了不同的cascade
和fetching
类型,其中一些类型出现了很多错误。仍然是同样的情况。在我看来,应该有一种方法可以通过修改实体之间的关系来实现这一点。
3条答案
按热度按时间6ovsh4lw1#
在持久化产品时,您不需要填充Category,也不需要在持久化产品之前使用select获取它。* 您可以获取类别的引用,并在Product实体中提供它并持久化它。* 此外,我建议为
@ManyToOne as Lazy
定义获取策略tag5nh1u2#
更新:解决方案。需要使用DTO与ModelMapper。在ProductD中使用categoryName创建字段名称。但它应该与Category实体类中的categoryName字段相同。ModelMapper会自动将这些Map到字段。所以我可以只获取和添加categoryName而无需填充整个Category对象。
qij5mzcb3#
首先,您必须在数据库中创建具有不同ID的产品类别。当您发布产品时,您必须在JSON文件中显示categoryId。为findById创建存储库类后,如果类别不存在,则无法执行此操作。因此,在新数据库中添加类别后,您可以通过仅发送类别ID来发布产品。顺便说一下,请尝试发送DTO而不是实体。