Как правильно отобразить список в спящем режиме - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь реализовать базу данных config, используя MariaDB и Hibernate на Java. Позвольте A быть Человеком, который может иметь B. Лицензии. Каждая лицензия b состоит из списка C (некоторый объект, который содержит строку и целое число).

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 в Bs A / добавить C в Cs B -> сохранить -> избыточные поля остаются в базе данных).

Как правильно это сделать? До сих пор я безуспешно пытался использовать @ElementCollection, CascadeType.persist и orphanRemoval = true.

1 Ответ

0 голосов
/ 06 ноября 2018

Добавить обновляемый false в @JoinColumn, чтобы он не изменял дочерние таблицы при сохранении родительских

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