您如何在休眠状态下正确映射列表

时间:2018-11-06 09:18:16

标签: java sql hibernate java-8 mariadb

我正在尝试使用MariaDB和Java中的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时没有运气。

1 个答案:

答案 0 :(得分:0)

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