每个PUT重复@OneToMany重复***更新***

时间:2019-01-30 02:06:18

标签: spring hibernate spring-boot spring-data-jpa spring-data

我有以下实体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条记录。然后我添加了另一个tableB,因此我在PUT请求中发送了以下内容:

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

这将创建Bname2加上另一个Bname1。所以我已经有3条记录。然后我添加另一个tableB:

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

这将创建Bname3,但又创建了另一个Bname1和Bname2,现在在table_b中获得6条记录。我这样做是因为我认为休眠将自动处理更新。因为我有更新一个tableB记录的场景,所以删除一个tableB记录并添加新的tableB记录,然后发送一个PUT请求。请告知。

这是我的DAO

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

UPDATE

我认为可以通过在Bname中设置“ id”来解决重复项,即{id: 1, tableAName: "Test", tableBs: [{id: 1, name: "Bname1", tableAId: 1}]} ...之前我发送了id =“”。因此,即使创建新的tableA或添加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仍在表中。它没有被删除。这是我剩下的问题。

第二次更新 我也解决了删除问题。我添加了orphanRemoval = true,并且从用户界面中,我仍然发送要删除的项目,但删除了属性“ tableAId”:

这会使Bname1成为孤儿并进入休眠状态,从而自动将其从表中删除。

{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;

0 个答案:

没有答案