Hibernate - 复合主键包含外键
Hibernate - Composite Primary Key contains Foreign Key
我有一个类似的问题,但解决方案没有解决我的问题。
hibernate composite Primary key contains a composite foreign key, how to map this
我正在尝试连接 2 个表,每个表都有一个带有部分外键引用的复合主键。
Table A
--------
f1 (pk)
f2 (pk)
f3 (pk)
f4 (pk)
Table B
--------
f1 (pk, fk)
f2 (pk, fk)
f5 (pk)
f6 (pk)
I created A, APK, B, BPK
在答:
private Set<B> bSet;
@OneToMany(targetEntity=B.class, cascade = CascadeType.ALL, mappedBy= "bpk.a")
public Set<MovesEntity> getBSet() {
return bSet;
}
在 BPK 中:
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="f1", referencedColumnName="f1", nullable=false, insertable=false, updatable = false),
@JoinColumn(name="f2", referencedColumnName="f2", nullable=false, insertable=false, updatable = false)
})
public A getA() {
return a;
}
上述方法给了我这个异常:
AnnotationException: referencedColumnNames(f1, f2) of entity.BPK.bpk.a
referencing com.example.entity.A not mapped to a single property
你能帮忙吗?
假设 f1 和 F2 唯一标识 A 并且存在于 APK 中,您可以通过几种方式为此使用 JPA 2.0 的派生 ID。最容易展示的是:
@Entity
@IdClass(BPK.class)
public class B {
@ID
String f5;
@ID
String f6;
@ID
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="f1", referencedColumnName="f1", nullable=false),
@JoinColumn(name="f2", referencedColumnName="f2", nullable=false)
})
A a;
}
public class BPK {
String f5;
String f6;
APK a;
}
这里的关键点是 B 引用了控制外键字段 f1 和 f2 的 A,并且 A 的主键在 B 的主键中使用 - 与关系同名。映射它的另一种方法是使 B 的 PK 成为 embeddid id,但嵌入式 ID 仍然不能有引用映射,所以它可能看起来:
@Entity
@IdClass(BPK.class)
public class B {
@EmbeddedId
BPK pk;
@MapsId("apk")
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="f1", referencedColumnName="f1", nullable=false),
@JoinColumn(name="f2", referencedColumnName="f2", nullable=false)
})
A a;
}
@Embeddable
public class BPK {
String f5;
String f6;
APK apk;
}
注意 mapsId - 这告诉 JPA 嵌入式 'apk' 引用中的列使用从 A 中提取的引用映射中的外键字段。JPA 将从引用映射中为您填充外键,如果您使用排序很重要。
我有一个类似的问题,但解决方案没有解决我的问题。
hibernate composite Primary key contains a composite foreign key, how to map this
我正在尝试连接 2 个表,每个表都有一个带有部分外键引用的复合主键。
Table A
--------
f1 (pk)
f2 (pk)
f3 (pk)
f4 (pk)
Table B
--------
f1 (pk, fk)
f2 (pk, fk)
f5 (pk)
f6 (pk)
I created A, APK, B, BPK
在答:
private Set<B> bSet;
@OneToMany(targetEntity=B.class, cascade = CascadeType.ALL, mappedBy= "bpk.a")
public Set<MovesEntity> getBSet() {
return bSet;
}
在 BPK 中:
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="f1", referencedColumnName="f1", nullable=false, insertable=false, updatable = false),
@JoinColumn(name="f2", referencedColumnName="f2", nullable=false, insertable=false, updatable = false)
})
public A getA() {
return a;
}
上述方法给了我这个异常:
AnnotationException: referencedColumnNames(f1, f2) of entity.BPK.bpk.a
referencing com.example.entity.A not mapped to a single property
你能帮忙吗?
假设 f1 和 F2 唯一标识 A 并且存在于 APK 中,您可以通过几种方式为此使用 JPA 2.0 的派生 ID。最容易展示的是:
@Entity
@IdClass(BPK.class)
public class B {
@ID
String f5;
@ID
String f6;
@ID
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="f1", referencedColumnName="f1", nullable=false),
@JoinColumn(name="f2", referencedColumnName="f2", nullable=false)
})
A a;
}
public class BPK {
String f5;
String f6;
APK a;
}
这里的关键点是 B 引用了控制外键字段 f1 和 f2 的 A,并且 A 的主键在 B 的主键中使用 - 与关系同名。映射它的另一种方法是使 B 的 PK 成为 embeddid id,但嵌入式 ID 仍然不能有引用映射,所以它可能看起来:
@Entity
@IdClass(BPK.class)
public class B {
@EmbeddedId
BPK pk;
@MapsId("apk")
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="f1", referencedColumnName="f1", nullable=false),
@JoinColumn(name="f2", referencedColumnName="f2", nullable=false)
})
A a;
}
@Embeddable
public class BPK {
String f5;
String f6;
APK apk;
}
注意 mapsId - 这告诉 JPA 嵌入式 'apk' 引用中的列使用从 A 中提取的引用映射中的外键字段。JPA 将从引用映射中为您填充外键,如果您使用排序很重要。