У меня есть следующая сущность 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 = "".Тем не менее, у меня все еще есть проблема удаления.Сценарий таков:
- Я добавляю Bname4
- Я обновляю Bname3
- Я удаляю 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;