我有这些类(class)。
@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 |....other fields...|
B) | id_B | fk_id_A |..other fields..|
但是,当我尝试删除 A 的一个实例时,我得到了,
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade : (remove deleted object from associations)[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
总是返回一个有效的 session 。
有什么我遗漏的吗?
最佳答案
从上到下继续工作。您需要删除表 B 中对 A 的引用。因此,在 B 中找到您要在 A 中删除的记录的引用,并在 B 中删除该记录。然后返回 A 并删除 A 中的记录。
如果您使用的是 SQL Server,您可以在表 A 上设置级联删除,这将自动为您完成。不过,您必须小心。对于复杂的结构,我不建议这样做。
关于java - 删除一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080771/