删除一对一的关系

时间:2009-07-03 20:46:32

标签: java hibernate one-to-one

我有这些课程。

@Entity
@Table(name ="a")
class A{
  private Integer aId;
  private B b;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id_a")
  public Integer getAId() {
return aId;
  }

  @OneToOne(mappedBy = "a", cascade={CascadeType.ALL})
  public B getB() {
        return b;
    }
}

@Entity
@Table (name= "b")
class B{
    private A a;

    @OneToOne
    @JoinColumn(name = "id_a")
    public A getA() {
        return a;
    }

}

表格如下:

  

A)| id_A | ....其他领域...... |

     

B)| id_B | fk_id_A | ..其他字段.. |

但是,当我尝试删除A的实例时,我得到了

  

org.hibernate.ObjectDeletedException:   删除的对象将被重新保存   级联:           (从关联中删除已删除的对象)[B#130]

我尝试在交叉引用上设置null:

b.setA(null) 
a.setB(null)

但异常仍然被抛出。

我所做的就是删除A中的一行,并将B的外键保留为null,但是当我尝试删除B时,会得到相同的错误。

这是我的删除代码:

public static void delete(Object object) throws Exception {
        Transaction tx = getSession().beginTransaction();       
        try {
            getSession().delete(object);
            tx.commit();
        } catch (Exception ex) {
            tx.rollback();
            getSession().close();
            throw ex;
        }
    }

getSession始终返回有效会话。

我有什么遗漏吗?

2 个答案:

答案 0 :(得分:1)

从顶部开始继续工作。您需要删除表B中对A的引用。因此,在A中找到您要删除的记录的B中的引用,并在B中删除该记录。然后返回A并删除A中的记录。 p>

如果您正在使用SQL Server,则可以在表A上设置级联删除,这将自动为您完成。你必须要小心这一点。我不建议将它用于复杂的结构。

答案 1 :(得分:0)

您是否在单独的交易中执行交叉引用的归零操作?可能需要提交这些更改才能使删除工作。