java - 您如何正确映射休眠中的列表
问题描述
我正在尝试在 Java 中使用 MariaDB 和 Hibernate 实现一个配置数据库。假设 A 是可以拥有 B 许可证的人。每个许可证 b 都包含一个 C 列表(一些包含字符串和 int 的对象)。
class A {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "b_id")
List<B> bs;
}
class B {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "b_id")
private long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "c_id")
List<C> bs;
}
class C {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "c_id")
private long id;
String blabla;
int i;
}
我可以保存它,但是当重新保存更改的 A 时,我无法在不保留冗余字段的情况下更新它(从数据库加载 A -> 将 B 添加到 A 的 Bs / 将 C 添加到 B 的 Cs -> 保存 -> 冗余字段保留在数据库中)。
这样做的正确方法是什么?到目前为止,我尝试使用 @ElementCollection、CascadeType.persist 和 orphanRemoval = true,但没有成功。
解决方案
在@JoinColumn 中添加可更新的 false 所以它不会在保存父表时更改子表
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "b_id",updatable=false)
List<B> bs;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "c_id",updatable=false)
List<C> bs;
推荐阅读
- amazon-ec2 - Azure DevOps 多个发布管道
- rust - rustfmt 的未知配置选项“group_imports”
- javascript - 通过数组反应循环
- c++ - 检测不同背景的身份证(HSV 和 Canny 方法)
- angular - 如何在订阅中返回值?
- r - R扫描字符的数据帧,但仅在参数列中
- javascript - 使用 Blazor WASM,我想在窗口打开时显示浏览器窗口的尺寸
- android - 如何在 Firebase Android 中使用多个 WhereIn 查询?
- python - 读取嵌套字典中的 csv 文件存储数据
- python - 如何有效地调用多个变量的方法?