java - 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 个值(为空)。所以表格看起来像这样:
解决方案
Hibernate 处理单向关系的效率非常低,请尝试使用双向关系。
关于上述问题,这里不需要第三张表,可以通过添加@JoinColumn 来避免创建第三张表,如下所示:
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_a_id")
List<SomeObject> someObjectsList;
这将在 SOME_OBJECT 表中添加列“fk_a_id”。
推荐阅读
- javascript - 我想找到与数组 Java Script 中的字符串完全匹配
- git - 我应该采取什么样的行动来获取“master”分支中的最新源代码?
- python - 无法调用“wm”命令:应用程序已被销毁
- javascript - 谷歌地图上的标记聚类不起作用但显示所有位置?
- flutter - 如何使 FloatingActionButton 居中对齐
- python - SQLAlchemy python相同地复制表并将其粘贴到其他地方
- fish - `ls > fifo &` blocks fish shell
- c - 写入地址 0x0090000 时发生访问冲突
- python - 两列取决于第三列的值。如何链接这些值
- sql-server - 今天的日期作为列名