[英]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.