多对多的关系 - 休眠

时间:2012-10-12 10:40:00

标签: hibernate many-to-many cascade

我正在使用hibernate-jpa-2.0-api 1.0.0.Final和hibernate 3.5.5-Final。

我有用户和角色实体,每个实体彼此之间具有多对多关系(双向)。我有以下要求:

1 - 如果调用deleteRole(role)方法,并且此用户具有hibernate的角色应该抛出异常,否则可以成功删除该角色。
2 - 如果调用deleteUser(user)方法,则可以成功删除用户,并自动从关系表中删除相关记录,但不应删除其角色。
3 - Furhermore;如果我创建新角色并将一些用户添加到其集合中并最终保留角色,则应该保留其用户而不进行额外的持久操作。

假设角色 Test1 用户 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;
    }
}

TestCode

    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);  

此代码成功地将预期的entires添加到所有3个表。但是,起初我只尝试了Cascade.PERSIST和Cascade.MERGE,它给出了未保存的对象异常。然后我尝试了ALL,并且成功完成了。有趣的是,我添加了所有javax Cascade操作,我的意思是单独但没有成功抛出相同的异常(未保存的obj ...)。现在,问题是每当我删除t1时它也会删除t21和t22,这违反了req.1。

0 个答案:

没有答案