我已经找到了这个问题的两种解决方案。
第一个是解决方法,不像第二个那么整洁。
将实体的主键定义为包含 、 和 的复合键,并且首先应该作为主键定义为唯一约束。缺点是列在概念上并不是主键的一部分。B
col_a
col_b
col_c
col_c
@Entity
class A {
@Id
private int b;
@Id
private int c;
}
@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "a", "b" }) })
class B {
@Id
private int a;
@Id
@ManyToOne(optional = false)
@JoinColumns(value = {
@JoinColumn(name = "b", referencedColumnName = "b"),
@JoinColumn(name = "c", referencedColumnName = "c") })
private A entityA;
}
第二个使用和注释,并完全按照我一开始就想要做的事情。@EmbeddedId
@MapsId
@Entity
class A {
@Id
private int b;
@Id
private int c;
}
@Embeddable
class BKey {
private int a;
private int b;
}
@Entity
class B {
@EmbeddedId
private BKey primaryKey;
@MapsId("b")
@ManyToOne(optional = false)
@JoinColumns(value = {
@JoinColumn(name = "b", referencedColumnName = "b"),
@JoinColumn(name = "c", referencedColumnName = "c") })
private A entityA;
}