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

Jag*_*ger 8 java hibernate foreign-keys composite-key composite-primary-key


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

-------
TABLE_A
-------
col_b (pk)
col_c (pk)
[other fields]

-------
TABLE_B
-------
col_a (pk)
col_b (pk) (fk TABLE_A.col_b)
col_c (fk TABLE_A.col_c)
[other fields]

如何使用Hibernate管理它?

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

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

Jag*_*ger 7

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

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

B实体的主键定义为包含col_a,col_bcol_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;
}
Run Code Online (Sandbox Code Playgroud)

第二个使用@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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这种方式,但收到“无法在 @MapsId 映射中找到列引用:c”。任何想法?。TIA (2认同)