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モデルから生成されています。
私はこの問題に対する2つの解決策を見つけました。
最初のものはかなり回避策であり、2番目のものほどきれいではありません。
B
エンティティの主キーをcol_a
、col_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;
}