我有两个具有以下关系的类
回应:
@Entity
@Table(name="responses")
public class Response {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonBackReference
@ManyToOne(fetch=FetchType.EAGER, optional=true, cascade=CascadeType.ALL)
@JoinColumn(name = "idq")
private Question question;
问题:
@Entity
@Table(name="questions")
public class Question {
@Id
@Column(name = "idq")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idq;
@JsonManagedReference
@OneToMany(mappedBy = "question")
private List<Response> respons = new ArrayList<>();
我正在尝试使用 Postman 进行一些休息测试,同时填充数据库。 当我发送 JSON Question 对象时,Post 请求看起来不错,这里有三个不同的请求
{
"idT" : 1,
"num" : 25,
"quest" : "Ceci est la question 1"
}
{
"idT" : 2,
"num" : 26,
"quest" : "Ceci est la question 2"
}
{
"idT" : 4,
"num" : 27,
"quest" : "Ceci est la question 3"
}
但是我尝试发送一个响应测试,其中包含对问题所有者的引用,希望休眠状态会注意到问题已经存在,并且只将响应保存在数据库中。
{
"question" : {
"idq" : 1,
"idT" : 1,
"num" : 25,
"quest" : "Ceci est la question 1"
},
"car" : "D",
"resp" : "Ceci est la reponse numero 4",
"idq" : 1
}
这是我不想要的结果,第四个条目不应该存在。我在这里给出了问题对象编号 1。
此时我不知道是否必须通过更好的编写控制器来解决问题,或者是否有办法通过休眠和注释来解决问题,或者是否必须改进数据库表创建中的某些内容
这是响应数据库表中的条目。我很高兴看到 hibernate 写了正确的参考 idq。
当您为 idq 使用自动增量列时,DB 会为 idq 列生成自动增量的唯一 id。
当您再次发送请求(idq=1)时,hibernate 会将其作为新条目插入,因为您可能没有在代码中手动设置 idq 列。
如果您想更新现有记录,则可以使用
INSERT ON DUPLICATE KEY UPDATE
它尝试使用请求中收到的新数据更新旧记录(如果它已经存在)。
您可以访问https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html了解更多信息