@OneToMany дубликатов для каждого PUT *** ОБНОВЛЕНИЕ *** - PullRequest
0 голосов
/ 30 января 2019

У меня есть следующая сущность A:

@Entity
@Table(name="table_a")
public class TableA {
    ...
    @Fetch(FetchMode.SUBSELECT)
    @OneToMany(mappedBy="tableA", cascade=CascadeType.ALL)
    private List<TableB> tableBs;
    ...
}

@Entity
@Table(name="table_b")
public class TableB {
    ...
    @Column(name="table_a_id")
    private Long tableAId;

    @ManyToOne
    @JsonIgnore
    @JoinColumn(name="table_a_id", insertable=false, updatable=false)
    private TableA tableA;
}

В моем первом запросе PUT я отправил следующее:

{id: 1, tableAName: "Test", tableBs: [{name: "Bname1", tableAId: 1}]}

Это создает 1 запись в таблице.Затем я добавляю еще одну таблицу B, поэтому отправил в запрос PUT следующее:

{id: 1, tableAName: "Test", tableBs: [{name: "Bname1", tableAId: 1}, {name: "Bname2", tableAId: 1}]}

Это создает Bname2 плюс еще одно Bname1.Итак, у меня уже есть 3 записи.Затем я добавляю еще одну таблицу B:

{id: 1, tableAName: "Test", tableBs: [{name: "Bname1", tableAId: 1}, {name: "Bname2", tableAId: 1}, {name: "Bname3", tableAId: 1}]}

Это создает Bname3, но создает еще Bname1 и Bname2, теперь получая 6 записей в table_b.Я делаю это, потому что я думал, что Hibernate будет обрабатывать обновление автоматически.Поскольку у меня есть сценарий, в котором я обновляю одну запись tableB, удаляю одну запись tableB, добавляю новую запись tableB и затем отправляю запрос PUT.Пожалуйста, сообщите.

Это мой DAO

public interface TableADAO extends JpaSpecificationExecutor<TableA>, JpaRepository<TableA, Long>

ОБНОВЛЕНИЕ

Я думаю, что дубликат уже решен путем установки"id" в Bname, то есть {id: 1, tableAName: "Test", tableBs: [{id: 1, name: "Bname1", tableAId: 1}]} ... ранее я отправлял id = "".Поэтому, даже если создать новую таблицу A или добавить tableB, я отправляю id = "".Тем не менее, у меня все еще есть проблема удаления.Сценарий таков:

  1. Я добавляю Bname4
  2. Я обновляю Bname3
  3. Я удаляю Bname1

Затем в запрос PUT я отправляюследующее:

{id: 1, tableAName: "Test", tableBs: [{id: 2, name: "Bname2", tableAId: 1}, {id: 3, name: "Bname3_update", tableAId: 1}, {id: "", name: "Bname4", tableAId: 1}]}

Но Bname1 все еще находится в таблице.Это не удалено.Это моя оставшаяся проблема.

2-е ОБНОВЛЕНИЕ Я также решил проблему удаления.Я добавил orphanRemoval = true и из пользовательского интерфейса я все еще отправляю элемент, который необходимо удалить, но удаляю свойство "tableAId":

Это делает Bname1 сиротой, а hibernate автоматически удаляет его из таблицы.

{id: 1, tableAName: "Test", tableBs: [{id: 1, name: "Bname1"}, {id: 2, name: "Bname2", tableAId: 1}, {id: 3, name: "Bname3_update", tableAId: 1}, {id: "", name: "Bname4", tableAId: 1}]}

@OneToMany(mappedBy="tableA", cascade=CascadeType.ALL, orphanRemoval = true)
private List<TableB> tableBs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...