这是我的场景,我试图通过使用@JoinColumn
与列a1, a2, a3的OneToMany关系将实体B关联到实体A,我得到了错误referenced column names not mapped to a single property
。后来我尝试了@Uniqueconstraint
与a1, a2和a3列在表A上,我不能成功。有谁能帮我把实体B和A关联为@ onmany关系吗?
A
--
a1
a2
a3
PrimaryKey -- a1 and a2
B
--
a1
a2
a3
b1
b2
PrimaryKey -- a1, a2, a3, and b1
@Entity
@Table(name = "A")
Class A
{
@EmbeddedId
private APK apk;
@Column(name="a3")
private Integer a3;
@OneToMany(mappedBy="a")
private Set<B> bSet;
}
@Embeddable
Class APK
{
@Column(name="a1")
private Integer a1;
@Column(name="a2")
private Integer a2;
}
@Entity
@Table(name = "B")
Class B
{
@EmbeddedId
private BPK bpk;
@Column(name="b2")
private Integer b2;
@ManyToOne
@JoinColumns({
@JoinColumn(name="a1", referencedColumnName="a1", insertable=false, updatable=false),
@JoinColumn(name="a2", referencedColumnName="a2", insertable=false, updatable=false),
@JoinColumn(name="a3", referencedColumnName="a3", insertable=false, updatable=false)
})
private A a;
}
@Embeddable
Class BPK
{
@Column(name="a1")
private Integer a1;
@Column(name="a2")
private Integer a2;
@Column(name="a3")
private Integer a2;
@Column(name="b1")
private Integer b1;
}
a3不是A的主键的一部分,因此在B表中不应该需要。
有几种方法可以映射这个,但如果使用JPA 2.1,我会使用:
@Entity
@Table(name = "A")
Class A
{
@EmbeddedId
private APK apk;
@Column(name="a3")
private Integer a3;
@OneToMany(mappedby='a')
List bList;
}
@Embeddable
Class APK
{
@Column(name="a1")
private Integer a1;
@Column(name="a2")
private Integer a2;
}
@Entity
@IdClass(BPK.class)
@Table(name = "B")
Class B
{
@Id
@Column(name="b1")
private Integer b1;
@Column(name="b2")
private Integer b2;
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name="a1", referencedColumnName="a1"),
@JoinColumn(name="a2", referencedColumnName="a2")
})
private A a;
}
@Embeddable
Class BPK
{
private APK a;
private Integer b1;
}
有很多方法来映射它。