Hibernate:在级联中更新具有唯一约束的元素

时间:2012-04-20 10:12:49

标签: hibernate

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

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

如果我反转两个单元格的位置,由于唯一的约束违规,网格的更新失败。

示例:将位置1,2(第1行,第2列)的单元格A转换为位置为3,4的单元格B.

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

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

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

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

当你提到“将他们的克隆添加到网格”时,你还没有发布你如何更新Cell以及你正在做什么代码?

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

当你说你删除这两个并刷新意味着你正在从数据库中删除条目并添加新的和那个点都是新的条目,因此没有例外。

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