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

データベースには、グリッドの行と列ごとに 1 つのセルのみを制限する一意の制約があります。

2 つのセルの位置を反転すると、一意の制約違反のためにグリッドの更新が失敗します。

例 : 位置 1、2 (行 1、列 2) のセル A と位置 3、4 のセル B を反転します。

私は多くのことを試しましたが、何もうまくいきませんでした。主な解決策は次のとおりです。

  • グリッドから 2 つの要素を削除し、それらをフラッシュして再度追加するか、それらのクローンをグリッドに追加します。

問題は、セルのパラメーターからも発生する可能性があることに注意してください。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

「グリッドにクローンを追加する」と言及したときに、セルをどのように更新しているのか、コードに関して正確に何をしているのかを投稿していません。

更新時の説明によると、インスタンスの行と列のプロパティを単純に設定し、グリッドを更新していると仮定しています。グリッドが操作をカスケードすると、最初の更新エントリを 3,4 で更新しようとしますが、そのエントリは既に存在するため、例外が発生します。

両方を削除してフラッシュすると言う場合、データベースからエントリを削除し、新しいエントリを追加することを意味し、その時点は両方とも新しいエントリであるため、例外はありません。

私が考えることができるのは、それが起こっているに違いありません。希望が役立ちます!!!!

于 2012-04-20T10:45:04.443 に答える