我有以下实体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 =“”。但是,删除还是有问题。情况是:
然后在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;