具有一部分复合主键的 Hibernate 外键

Hibernate foreign key with a part of 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 模型生成的。

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

第一个是一种变通方法,不像第二个那么整洁。

B 实体的主键定义为包含 col_acol_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;
}

第二个使用 @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;
}