一尘不染

带有部分组合主键的休眠外键

hibernate

我必须与Hibernate合作,但我不确定如何解决此问题,我有2个具有1..n关系的表,如下所示:

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

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

如何使用Hibernate进行管理?

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

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


阅读 253

收藏
2020-06-20

共1个答案

一尘不染

我找到了解决此问题的两种方法。

第一个是一种解决方法,没有第二个那么整洁。

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