删除对象时我有一个奇怪的问题。我正在使用Play Framework 1.2.5和PostgreSQL 9.1版。
我有以下两种型号:
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仍被车号2对象作为父母引用。
现在发生了什么?我希望这个CarCollection将被车号1删除,而在车号为2的实体中,父值将为空(参考删除)。
开箱即用它不起作用!怎么了?两辆车都将被删除。但这不是我期望或想要的。
所以我决定用覆盖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,也不会帮助我。
那么,我该如何解决这个问题呢?也许我的模型定义或依赖性定义错误了?!
答案 0 :(得分:1)
删除某些实体时涉及两件事:
在您的示例中,“副本”关系具有级联所有注释。因此,如果car2位于'car1'的'副本'列表中,它将被传递删除。
如果要通过覆盖delete方法手动破坏关系,则必须以两种方式执行此操作。在您的情况下,当您将parent设置为null时,不会从副本列表中删除子项。