我正在使用 hibernate-jpa-2.0-api 1.0.0.Final 和 hibernate 3.5.5-Final。
我有用户和角色实体,每个实体彼此之间都有多对多的关系(双向)。我有以下要求:
1-如果调用了deleteRole(role)方法并且这个角色有用户,那么hibernate应该抛出异常,否则角色可以被成功删除。
2-如果调用deleteUser(user)方法,用户可以成功删除,相关记录自动从关系表中删除,但其角色不应该被删除。
3-此外;如果我创建新角色并将一些用户添加到其集合中并最终保留角色,则应保留其用户而无需额外的持久操作。
假设Role是Test1,User是Test2。实体:
测试1(角色)
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import com.ttnet.model.BaseModel;
@Entity
public class Test1 extends BaseModel {
@ManyToMany(targetEntity = Test2.class, cascade = { CascadeType.ALL })
@JoinTable(name = "test1_test2", joinColumns = { @JoinColumn(name = "id1", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "id2", nullable = false, updatable = false) })
private Set<Test2> test2s = new HashSet<Test2>(0);
public Set<Test2> getTest2s() {
return test2s;
}
public void setTest2s(Set<Test2> test2s) {
this.test2s = test2s;
}
}
测试2(用户)
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import com.ttnet.model.BaseModel;
@Entity
public class Test2 extends BaseModel {
@ManyToMany(targetEntity=Test1.class, mappedBy = "test2s")
private Set<Test1> test1s = new HashSet<Test1>(0);
public Set<Test1> getTest1s() {
return test1s;
}
public void setTest1s(Set<Test1> test1s) {
this.test1s = test1s;
}
}
测试代码
Test1Bo test1Bo = (Test1Bo) context.getBean("test1Bo");
Test2Bo test2Bo = (Test2Bo) context.getBean("test2Bo");
Test1 t1 = new Test1();
Test2 t21 = new Test2();
Test2 t22 = new Test2();
Set<Test2> t2Set = t1.getTest2s();
t2Set.add(t21);
t2Set.add(t22);
test1Bo.addTest1(t1);
此代码成功地将预期的整体添加到所有 3 个表中。但是,起初我只尝试了 Cascade.PERSIST 和 Cascade.MERGE,它给出了未保存的对象异常。然后我尝试了ALL,它成功完成了。有趣的是,我添加了所有 javax Cascade 操作,我的意思是个别但没有成功抛出相同的异常(未保存的 obj ...)。现在,问题是每当我删除 t1 时,它也会删除 t21 和 t22,这违反了 req.1。