0

在我的应用程序中,我有一个包含许多单元格的网格。这些单元格可以包含许多参数。

@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 反转。

我尝试了很多东西,但没有任何效果。主要解决方案是:

  • 从网格中删除这两个元素,刷新并再次添加它们或将它们的克隆添加到网格中。

请注意,问题也可能来自单元格的参数。

我该如何解决这个问题?

4

1 回答 1

0

当您提到“将它们的克隆添加到网格”时,您还没有发布您如何更新单元格以及您正在做什么代码明智。

根据更新时的描述,我假设您只是在考虑设置实例的属性行和列并更新 Grid。当 Grid 级联操作时,它将尝试将第一个更新条目更新 3,4,但该条目已经存在,因此出现异常。

当您说您同时删除并刷新时,这意味着您正在从数据库中删除条目并添加新条目,并且这两个条目都是新条目,因此也不例外。

这就是我能想到的必须发生的事情。希望有帮助!!!!

于 2012-04-20T10:45:04.443 回答