2012-04-20 11 views
0

私のアプリケーションでは、私は多くのセルを含むグリッドを持っています。これらのセルには、多くのパラメータを含めることができます。Hibernate:カスケード内のユニーク制約を持つ要素を更新する

@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つのセルの位置を逆転させると、唯一の制約違反のためにグリッドの更新が失敗します。

例:私は多くのことを試みたが、何も働いていない4.

、位置3を有するセルBとの位置1、2(行1、列2)でセルAを反転します。主な解決策は、

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

この問題は、Parameters of the Cellでも発生する可能性があることに注意してください。

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

答えて

0

セルを更新する方法と、「自分のクローンをグリッドに追加する」と言ったときに、正確にコードが何を行っているのかを投稿していません。

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

両方を削除してフラッシュすると、データベースからエントリを削除して新しいポイントとそのポイントを追加するということは、両方とも新鮮なエントリなので例外ではありません。

私は考えられることが起こっているはずです。ホープは助けになる!!

関連する問題