这样做的方法是定义两个@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);
....
希望这可以帮助。
莎拉