我需要测试一些代码,但这些代码不是我自己写的。这是一个集成测试:应用程序在服务器上持续运行,我的测试针对它运行。
这些测试是使用Selenium编写的,它们启动浏览器,在其中执行一些JavaScript以模拟用户操作,并检查数据库是否正确更新。我必须在每次测试后将数据库恢复到其初始状态。
为此,我使用Spring注释和Hibernate通过DAO进行操作,但这些DAO并不是我自己编写的。
问题在于存在循环外键。A类对象与B类型对象具有OneToMany关系,并且还有与同一类的ManyToOne关联。我尝试在同一事务中删除类型A的对象及其所有相关的B,但它不起作用,因为Hibernate在删除A类型对象之前尝试将"defaultB"设置为null。虽然在删除引用的B类型对象后将其置空是有意义的,但完全没有必要在删除A类型对象之前这样做。
我(天真地)认为,因为这2个操作在同一事务中执行,所以删除引用(并被引用)类B对象的A对象并同时删除b对象不会有问题。然而,我错了。如果没有更改DB模型(我没有编写),有没有办法做到这一点?
更新1:我不明白为什么当我执行mySession.delete(B)时,Hibernate尝试将一个已知为非空的键置为空值...对此有何想法吗?
更新2:从类C到类B存在一对多关系。当我删除具有此c_id的C对象时,Hibernate还尝试将相应于B的表中的“c_id”字段置为空。即使在其“父级”之前删除了B类对象。我知道Hibernate会重新排序查询并添加一些自己的内容,但我不明白为什么要重新排序已经按正确顺序排列的查询以使它们失败。
这里是(相关部分的)类:
@Entity
@Table(name = "A")
public class A {
private Set<B> bs;
private B defaultB;
@OneToMany(mappedBy = "a", fetch = LAZY)
public Set<B> getBs() {
return bs;
}
public void setBs(Set<B> bs) {
this.bs = bs;
}
@ManyToOne(fetch = LAZY, optional = false)
@JoinColumn(name = "default_b_id", nullable = false)
public B getDefaultB(){
return defaultB;
}
public void setDefaultB(B defaultB) {
this.defaultB = defaultB;
}
}
@Entity
@Table(name = "B")
public class B {
private a;
@ManyToOne(fetch = LAZY, optional = false)
@JoinColumn(name = "A_id", nullable = false)
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
defaultB
是否是Bs
的成员?您能展示一下您的删除逻辑吗? - Pascal Thivent