我找到了解决此问题的两种方法。
第一个是一种解决方法,没有第二个那么整洁。
将
B实体的主键定义为包含
col_a,
col_b和的复合键,
col_c首先将假定为主键的内容定义为唯一约束。缺点是,从
col_c概念上讲,该列实际上并不是主键的一部分。
@Entityclass 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注释,并且恰好做了我一开始想要做的事情。
@Entityclass A { @Id private int b; @Id private int c;}@Embeddableclass BKey { private int a; private int b;}@Entityclass 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;}


