Hibernate外键与复合主键的一部分

我必须使用Hibernate并且我不太确定如何解决这个问题,我有2个表与1..n关系,如下所示:

 -------
 TABLE_A
 -------
 col_b(pk)
 col_c(pk)
 [其他领域]

 -------
表-B
 -------
 col_a(pk)
 col_b(pk)(fk TABLE_A.col_b)
 col_c(fk TABLE_A.col_c)
 [其他领域]

如何使用Hibernate进行管理?

我不知道如何声明包含主键部分的外键。

我的数据库模式是从Hibernate模型生成的。

我找到了两个解决这个问题的方法。

第一个是解决方法,并不像第二个那样整洁。

B实体的主键定义为包含col_acol_bcol_c复合键,以及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; } 

Jagger的第二个解决方案是我的第一个反应,包括@EmbededId和@MapsId。 以下是基于他的第二个解决方案但不使用@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; @ManyToOne(optional = false) @JoinColumns(value = { @JoinColumn(name = "b", referencedColumnName = "b", insertable= false, updatable= false), @JoinColumn(name = "c", referencedColumnName = "c") }, ) private A entityA; }