[英]Hibernate: saving an entity with foreign primary key
我有一個包含兩個實體( Product和Feedback )的數據庫。 反饋有一個指向 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
,而product
是Product
類。 如何為 Spring 應用程序提供正確的對象以便save
其save
在數據庫中?
我正在嘗試遵循 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.