オブジェクトの削除に奇妙な問題があります。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()」しても、役に立ちません。
では、どうすればこの問題を解決できますか? モデル定義または依存関係の定義が間違っているのではないでしょうか?!