我有一个包含两个实体(产品和反馈)的数据库。反馈有一个引用Product的外键,其主键是整数。因此,它们之间是一对一的关系。

我想通过我的Web应用程序向数据库添加一个新的“反馈”条目。
为此,我试图从Angular客户端应用程序向Spring服务器执行PUT请求。

客户端具有一个Feedback类的对象,该对象具有以下属性(Feedback.ts的内容)

export class Feedback {
  constructor(
    public productId: number,
    public score: number,
    public preferred: boolean,
    public textNote: string
  ) {
  }
}


服务器端的类Feedback.java

@Entity
@Table(name = "feedback")
public class Feedback implements Serializable {
    @Id
    @JoinColumn(name = "product", unique = true)
    @OneToOne(cascade = CascadeType.ALL)
    private Product product;

    @Column(name = "score")
    private double score;

    @Column(name = "preferred")
    private boolean preferred;

    @Column(name = "textnote")
    private String textNote;

    // ... getters, setters, constructor

}


如您所见,存在一个不匹配的属性:productIdnumber,而productProduct类。如何为Spring应用程序提供正确的对象,以便在数据库中save

我正在尝试遵循Hibernate准则,据我所知,在类型为int的java类而不是Product的Java类中使用属​​性将是一种不好的做法。我该怎么办?

最佳答案

您从FE中使用productId创建一个新产品。现在,您可以创建一个设置了所有类型的新反馈对象。然后可以将其存储在数据库中。

[编辑]

通常,您在后端具有数据传输对象(DTO)。顾名思义,这些将表示传输数据没有其他作用。后端中的端点将始终获得与FE中相同的DTO。在您的情况下,创建一个FeedbackDto。

public class FeedbackDto {
   Long productId;
   Double score;
   Boolean preferred;
   String textNote;
}


端点将接收该对象,该对象具有与来自FE的反馈相同的字段。 Spring将根据请求的JSON正文中的值创建并填充您的对象

现在,从FeedbackDto创建一个Feedback实体:

new Feedback(new Product(feedbackDto.productId), feedbackDto.score, feedbackDto.preferred, feedbackDto.textNote)


现在,您可以将此反馈实体保存到数据库中。

关于java - hibernate :使用外键保存实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60225542/

10-10 08:53