在我的应用程序中,我有一个包含许多单元格的网格。这些单元格可以包含许多参数。
@Entity
@Table(name = "template")
public class Grid {
private Set<Cells> cells = new HashSet<Cells>(0);
@OneToMany(fetch = FetchType.LAZY, mappedBy = "grid", orphanRemoval=true)
@Cascade(value = {CascadeType.SAVE_UPDATE, CascadeType.DELETE})
public Set<Cell> getCells() {
return this.cells;
}
}
@Entity
@Table(name = "cell", uniqueConstraints = { @UniqueConstraint(columnNames={"idcell", "row", "column" })} )
public class Cell {
private Grid grid;
private int row
private int column;
private Set<Parameter> parameters = new HashSet<Parameters>(0);
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cellidgrid", nullable = false)
@ForeignKey(name = "coref_cell_grid")
@OnDelete(action = OnDeleteAction.CASCADE)
public Grid getGrid() {
return this.grid;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "cell", orphanRemoval=true)
@Cascade(value = {CascadeType.SAVE_UPDATE, CascadeType.DELETE})
public Set<Parameter> getParameters() {
return this.parameters;
}
}
@Entity
@Table(name = "parameter")
public class Parameter {
private Cell cell;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parametercell")
@OnDelete(action = OnDeleteAction.CASCADE)
@ForeignKey(name = "coref_parameter_cell")
public Cell getCell() {
return this.cell;
}
}
数据库中有一个独特的约束,它为 Grid 的每一行和每一列只限制一个 Cell。
如果我反转两个 Cell 的位置,则 Grid 的更新会因为违反唯一约束而失败。
示例:将位置为 1、2(第 1 行、第 2 列)的单元格 A 与位置为 3、4 的单元格 B 反转。
我尝试了很多东西,但没有任何效果。主要解决方案是:
- 从网格中删除这两个元素,刷新并再次添加它们或将它们的克隆添加到网格中。
请注意,问题也可能来自单元格的参数。
我该如何解决这个问题?