首页 > 解决方案 > JPA 存储库表不保存新 ID,而是覆盖或修改

问题描述

我有A.class

@Entity
@Data
public class A {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    Integer id;

    String someStringInAclass;

    @OneToMany(cascade = CascadeType.ALL)
    List<SomeObject> someObjectsList;
}

我有SomeObject.class

@Entity
@Data
public class SomeObject {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    Integer id;
    String someString;
    Integer someInteger;
}

我在数据库中保存了一个对象:

SomeRepository.save(A);

表格如下所示:

在此处输入图像描述

然后我在 B 对象中使用不同的值再次保存 A 对象:

SomeRepository.save(A);

然后表格如下所示:

在此处输入图像描述

表 B 已正确扩展,但表 A_B 只是覆盖了 B_id 而不是将新的 4 行。

然后,当我从数据库中检索对象 A 时,我只从 B 对象中获得最后 4 个值。

如何在不覆盖的情况下保存新值(向 A_B 添加新行)?

编辑:

我将 A_id 添加为 B 表的外键。再次 - 第一次保存正确存储:

在此处输入图像描述

然后在使用 B 的不同值进行第二次保存后,它会修改 A_id 列的值,以插入第一个插入的 4 个值(为空)。所以表格看起来像这样:

在此处输入图像描述

标签: javapostgresqljpa

解决方案


Hibernate 处理单向关系的效率非常低,请尝试使用双向关系。

关于上述问题,这里不需要第三张表,可以通过添加@JoinColumn 来避免创建第三张表,如下所示:

     @OneToMany(cascade = CascadeType.ALL)   
     @JoinColumn(name = "fk_a_id")
     List<SomeObject> someObjectsList;

这将在 SOME_OBJECT 表中添加列“fk_a_id”。


推荐阅读