【发布时间】:2021-02-10 05:34:50
【问题描述】:
我有一个带有 id、name 和 surname 的 Hibernate 模型。我正在使用它从数据库中获取数据,然后在 GET 端点是这个:
@GetMapping(value = "/contacts", produces = MediaType.APPLICATION_JSON_VALUE)
public List<Contact> allContacts() {
return contactService.findAll();
}
如您所见,它返回Contact 对象。实际上它是一个 Hibernate 实体。
问题是当我使用这段代码时
@PostMapping("/contacts")
public Contact createContact(Contact contact) {
return contactService.createContact(contact);
}
它不仅询问name 和surname,还询问id。 POST 方法不应要求id,因为它们尚未创建。我应该怎么做才能让它不要求id?
编辑:这是 Contact.java 类
import lombok.Data;
import javax.persistence.*;
@Entity
@Data
public class Contact {
public Contact() {
}
public Contact(Integer id, String name, String surname) {
this.id = id;
this.name = name;
this.surname = surname;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "serial")
private Integer id;
private String name;
private String surname;
}
【问题讨论】:
-
您应该使用 DTO 并将实体仅保留在持久层中以实现干净的架构。之后,您将不再面临此问题。
-
联系人如何映射到您的表格?你有一个@GeneratedValue 来为它分配一个序列或类似的 id 吗?你能显示联系人的来源吗?
-
@Lkopo 这不是真的,它非常取决于场景。实体可以很好地用作发送和接收的数据模型,这并没有错。 Here我更详细地解释了这一点。
-
@ilhan 你能检查一下
@Entity class Contact{..}的id,它用于ID 生成的策略是什么?或者,请告诉我们Contact类。
标签: java spring-boot hibernate rest spring-data-jpa