如何在OneToMany ManyToOne关系中不保存第二次所有者

问题描述 投票:0回答:1

我有两个具有以下关系的类

回应:

@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。

spring rest hibernate-mapping
1个回答
0
投票

当您为 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了解更多信息

© www.soinside.com 2019 - 2024. All rights reserved.