具有一部分复合主键的 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_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;
}
第二个使用 @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;
}
我必须使用 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_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;
}
第二个使用 @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;
}