0

私は hibernate-jpa-2.0-api 1.0.0.Final と hibernate 3.5.5-Final を使用しています。

それぞれ多対多の​​関係 (双方向) を持つ User エンティティと Role エンティティがあります。以下の要件があります。

1- deleteRole(role) メソッドが呼び出され、このロールがユーザーを持っている場合、休止状態は例外をスローする必要があります。それ以外の場合、ロールは正常に削除されます。
2- deleteUser(user) メソッドが呼び出された場合、ユーザーは正常に削除され、関連レコードは関係テーブルから自動的に削除されますが、その役割は削除されません。
3-さらに; 新しい役割を作成し、そのセットに何人かのユーザーを追加して、最終的にその役割を永続化する場合、そのユーザーは追加の永続化操作なしで永続化する必要があります。

RoleTest1で、UserTest2だとしましょう。エンティティ:

テスト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;
    }
}  

Test2(ユーザー)

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 だけを試しましたが、保存されていないオブジェクトの例外が発生します。それから私はすべてを試してみましたが、成功して完了しました。興味深いことに、すべての javax Cascade 操作を個別に追加しましたが、同じ例外がスローされませんでした (保存されていない obj...)。ここでの問題は、t1 を削除するたびに t21 と t22 も削除され、これが req.1 に違反することです。

4

0 に答える 0