0

我的 Oracle DB 中的关系:

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

所以从A方面---->一对多

从B端--->多对一。

我只关心单向关系 a---b(一对多),这意味着每当我访问 A 时,我都想获得连接五列(A1、A2、A3、A4、A5)的 B 组

主键

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 作为外键出现)

这是遗留的数据库,我不能玩数据库,所以我想在 A 到 B 之间建立关系。我需要使用映射来处理这个问题,这可能吗????

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

我真的需要这方面的帮助。

4

1 回答 1

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)。使用所需的@JoinColumns 在 A 中为“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 列主键和 A 的 5 列外键)。

以下测试用例正确地创建了一个带有 2 个关联 B 的 A,可以使用 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);


....

希望这可以帮助。

莎拉

于 2013-09-02T22:36:42.583 回答