两个实体具有复合主键时,两个实体之间的一对多关系

时间:2013-08-30 15:05:13

标签: hibernate jpa nhibernate-mapping hibernate-mapping

我的Oracle DB中的关系:

A可能有很多B. B只有一个A

所以来自A面---->一对多

从B侧--->多对一。

我只关心单向关系a --- b(一对多),意思是每当我访问A我想得到一组B加入五列(A1,A2,A3,A4,A5)

主键

A1 A2 A3 A4 A5

所以它意味着A具有复合主键A1,A2,A3,A4,A5

B主键

A1 A2 A3 A4 A5 A6

所以这意味着A有复合主键A1,A2,A3,A4,A5,A6(A1,A2,A3,A4,A5作为外键)

这是leagcy DB,我无法使用DB,所以我想创建A到B之间的关系。我需要使用映射来处理这个问题,这可能吗????

如果你知道你的答案是否真的有效,请发帖,因为我已经尝试了一切。我不会冬眠不成熟。

我真的需要帮助。

1 个答案:

答案 0 :(得分:0)

这样做的方法是定义两个@Embeddable实体来表示A和B的复合键.BKey与AKey相同,只是它添加了“a6”属性。

AKey班级:

@Embeddable
public class AKey implements Serializable {
    private String a1;
    private String a2;
    private String a3;
    private String a4;
    private String a5;

    public AKey() {
    }

    public AKey(String a1, String a2, String a3, String a4, String a5) {
        this.a1 = a1;
        this.a2 = a2;
        this.a3 = a3;
        this.a4 = a4;
        this.a5 = a5;
    }

    ... // getters & setters
}

然后,您定义A类以将Embeddable复合键类用作@IdClass,但仍使用复合键元素作为属性。你会为B类做同样的事情(使用BKey)。在A中为具有所需@JoinColumns的“Set bs”属性定义@OneToMany映射。

@Entity
@IdClass(AKey.class)
public class A {

    @Id
    private String a1;
    private String a2;
    private String a3;
    private String a4;
    private String a5;

    @OneToMany(targetEntity=B.class, cascade={CascadeType.ALL}) 
        @JoinColumns({@JoinColumn(name="a1"), @JoinColumn(name="a2"), 
        @JoinColumn(name="a3"), @JoinColumn(name="a4"), @JoinColumn(name="a5")})
    private Set<B> bs = new HashSet<B>();

    public A() {
    }

    public A(AKey id, String prop1) {
        this.a1 = id.getA1();
        this.a2 = id.getA2();
        this.a3 = id.getA3();
        this.a4 = id.getA4();
        this.a5 = id.getA5();
        this.prop1 = prop1;
    }

    public Set<B> getBs() {
        return bs;
    }
    public void setBs(Set<B> bs) {
        this.bs = bs;
    }

    ... // getters & setters and anything else in A
}

我对这种方法没有任何问题 - 它期望你定义的表结构(A带有5列主键,B带有6列主键,5列带有A列外键)。

以下测试用例正确地创建了一个A,其中包含2个可以使用JQL检索的关联B。

B b = new B(new BKey("a", "b", "c", "d", "e", "1"), "prop1");
B b2 = new B(new BKey("a", "b", "c", "d", "e", "2"), "prop1");
A a = new A(new AKey("a", "b", "c", "d", "e"), "prop1");
a.getBs().add(b);
a.getBs().add(b2);

manager.persist(a);


....

希望这有帮助。

萨拉