首页 > 解决方案 > Hibernate:使用外主键保存实体

问题描述

我有一个包含两个实体(产品反馈)的数据库。反馈有一个引用 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

}

如您所见,有一个不匹配的属性:productIdis a number,而productis of class Product。如何save在数据库中为 Spring 应用程序提供正确的对象?

我正在尝试遵循 Hibernate 指南,据我所知,在 java 类型的类中使用属​​性int而不是Product. 我应该怎么办?

标签: javaspringhibernate

解决方案


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

[编辑]

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

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

Endpoint 将收到这个与 FE 反馈具有相同字段的对象。Spring 将根据请求的 JSON 正文中的值创建并填充对象

从 FeedbackD 到您现在创建一个反馈实体:

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

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


推荐阅读