2009-07-03 39 views
2

我有这些类。删除一对一的关系

@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 | ..其他字段.. |

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

org.hibernate.ObjectDeletedException: 删除对象将被重新保存由 级联: (删除删除对象从协会)B#130]

我试过交叉引用设置为null:

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

但异常仍然被抛出。

我所完成的所有工作是删除A中的一行,并将B的外键保留为空,但是当我试图删除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总是返回一个有效的会话。

有什么我失踪?

回答

1

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

如果您使用的是SQL Server,则可以在表A上设置级联删除,这将自动完成。尽管如此,你必须小心。我不会推荐这个复杂的结构。

0

您是否在单独的事务中执行交叉引用的置零?这些更改可能需要承诺删除工作。

相关问题