web-dev-qa-db-ja.com

複合主キーの一部を使用して外部キーを休止状態にする


Hibernateを使用する必要があり、この問題を解決する方法がよくわかりません。次のような1..nの関係を持つ2つのテーブルがあります。

 ------- 
 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モデルから生成されています。

8
Jagger

私はこの問題に対する2つの解決策を見つけました。

最初のものはかなり回避策であり、2番目のものほどきれいではありません。

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

2つ目は、@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;
}
7
Jagger