0

オブジェクトの削除に奇妙な問題があります。Play Framework 1.2.5 と PostgreSQL バージョン 9.1 を使用しています。

次の2つのモデルがあります。

1)

@Entity
public class CarCollection extends Model {
    @Required
    public String name;

    @OneToMany(mappedBy = "carCollection")
    public List<Car> cars;
}

2)

@Entity
public class Car extends Model {
    @Required
    public String name;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    public List<Car> copies = new ArrayList<Car>();

    @ManyToOne
    public Car parent;
}

したがって、私の場合、車を持つことができますが、それらをコピーして保存します。たとえば、車番号 2 は車番号 1 からコピーされるため、車番号 2 には親 = 車 1 があります。しかし、それらは異なる車コレクションにあります。今大事なこと!

次に、エンティティ (車番号 1) が含まれている CarCollection を 1 つ削除します。しかし、私が書いたように、1号車はまだ2号車オブジェクトによって親として参照されています。今、何が起きた?この CarCollection は車番号 1 で削除され、車番号 2 のエンティティでは親の値が null (参照が削除されます) になると予想されます。
そのままでは機能しません。何が起こるのですか?両方の車が削除されます。しかし、それは私が期待したり望んでいたものではありません。

そこで、次のように両方の delete() メソッドを上書きして、この問題を解決することにしました。

@Entity
public class CarCollection extends Model {
    @Override
    public CarCollection delete() {
    //delete cars manually
    for(Car car: this.cars){
        car.delete();
    }
}

@Entity
public class Car extends Model {
    @Override
    public Car delete() {
    //delete parents from copied cars
    for (Car car : this.copies) {
        car.parent = null;
        car.save();
    }
}

しかし、うまくいきません。私が何をしようとも関係ありません。この削除後に CarCollection を「refresh()」しても、役に立ちません。

では、どうすればこの問題を解決できますか? モデル定義または依存関係の定義が間違っているのではないでしょうか?!

4

1 に答える 1

1

一部のエンティティを削除する場合、次の 2 つのことが関係します。

  • カスケード定義は、外部キーを作成するときにデータベースに定義します
  • jpa 注釈のカスケード定義

あなたの例では、「コピー」関係にすべての注釈がカスケードされています。したがって、car2 が「car1」の「コピー」リストにある場合は、推移的に削除されます。

delete メソッドをオーバーライドして手動でリレーションを解除したい場合は、両方の方法で行う必要があります。あなたの場合、親をnullに設定しても、コピーリストから子を削除しません。

于 2012-09-10T05:48:42.720 に答える