我的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之间的关系。我需要使用映射来处理这个问题,这可能吗????
如果你知道你的答案是否真的有效,请发帖,因为我已经尝试了一切。我不会冬眠不成熟。
我真的需要帮助。
答案 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);
....
希望这有帮助。
萨拉