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

时间:2015-09-17 08:08:55

标签: 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模型生成的。

2 个答案:

答案 0 :(得分:6)

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

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

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;
}

答案 1 :(得分:-1)

Jagger的第二个解决方案是我的第一个反应,包括@EmbededId和@MapsId。以下是基于他的第二个解决方案但不使用@MapsId的另一种方法。 `

struct stat