如何删除父实体并在hibernate中的子FK列中设置null?

时间:2011-09-21 15:46:33

标签: java hibernate

以下是示例:

@Entity(name="Cat")
public class Cat
{
    @ManyToOne
    @JoinColumn(name="FoodId",nullable=true)
    public Food getFood()
    {
       // code
...
}

@Entity(name="Food")
public class Food
{
   @OneToMany(mappedBy="food",cascade=?
   public List<Cat> getCats()
   {
        // other code
...
}

我想删除一些食物实体,因此cat.foodId列设置为具有此食物的猫的空值。

Food fish=new Food()

Cat bazillio=new Cat()
bazillio.food=fish

context.remove(fish)

if (bazilio.food==null) success()

Cascade.ALL在我的理解中会删除所有带有这种食物的猫(或不是吗?)那么如何解决这个问题呢?

3 个答案:

答案 0 :(得分:2)

装上食物为鱼的所有猫,将每只猫的食物设置为空,然后删除食物。你需要处理你正在删除的食物的新猫的并发插入。他们可能会使“删除食物”交易失败。

答案 1 :(得分:2)

其中一个关系应标记为inverse。我想那会是Food.getCats() 食物与猫之间关系的级联应该是无,因为猫独立于nullable Cat.getFood()所证明的食物实体。

然后删除食物就像瑞安指定的那样简单。

  1. 在食物被指定食物的地方装猫
  2. 将cat.food设置为null
  3. 保存猫实例并删除食物实例(可以按任何顺序执行)

答案 2 :(得分:1)

程序员有责任保持这种一致性。

来自 JPA 2 Spec

  

请注意,应用程序负责   保持运行时关系的一致性 - 例如,为   确保双向的“一”和“多”两面   申请时,关系是彼此一致的   在运行时更新关系。

相关问题