我有这些课程。
@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
始终返回有效会话。
我有什么遗漏吗?
答案 0 :(得分:1)
从顶部开始继续工作。您需要删除表B中对A的引用。因此,在A中找到您要删除的记录的B中的引用,并在B中删除该记录。然后返回A并删除A中的记录。 p>
如果您正在使用SQL Server,则可以在表A上设置级联删除,这将自动为您完成。你必须要小心这一点。我不建议将它用于复杂的结构。
答案 1 :(得分:0)
您是否在单独的交易中执行交叉引用的归零操作?可能需要提交这些更改才能使删除工作。