Jag*_*ger 8 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模型生成的.
我找到了两个解决这个问题的方法.
第一个是解决方法,并不像第二个那样整洁.
将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;
}
Run Code Online (Sandbox Code Playgroud)
第二个使用@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;
}
Run Code Online (Sandbox Code Playgroud)