首页 > 解决方案 > 您如何正确映射休眠中的列表

问题描述

我正在尝试在 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,但没有成功。

标签: javasqlhibernatejava-8mariadb

解决方案


在@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;

推荐阅读