繁体   English   中英

Hibernate:使用外主键保存实体

[英]Hibernate: saving an entity with foreign primary key

我有一个包含两个实体( ProductFeedback )的数据库。 反馈有一个指向 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

}

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

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

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

[编辑]

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

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

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

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

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

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

我遇到了和你类似的问题,这篇博文帮助我解决了这个问题: https : //www.baeldung.com/spring-data-rest-relationships 如果您还使用 Spring Data REST,这非常有效,但我认为您可以根据自己的使用情况调整它。

基本上,在您创建您的Feedback条目(带有初始POST请求)之后,您应该执行另一个PUT请求以将Feedback条目关联到您的Product 对于您的示例,您可以使用以下内容:

curl -i -X PUT 
 -d "http://localhost:8080/feedback/1" 
 -H "Content-Type:text/uri-list" http://localhost:8080/product/1/feedbackProduct

您可以扩展 DefaultConversionService 并实现自定义转换器以将 id 转换为产品

 @Configuration
 public static class Config {
   @Bean
   public ConversionService conversionService () {
      DefaultConversionService service = new DefaultConversionService();
      service.addConverter(new IdToProductConverter());
      return service;
   }
 }

然后 IdToProductConverter 将收到 id 并可以从数据库中查找产品

class IdToProductConverter implements Converter<String, Product> {
    @Override
    public Product convert(String source) {
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM