簡體   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