我必须与Hibernate合作,但我不确定如何解决此问题,我有2个具有1..n关系的表,如下所示:
------- 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模型生成的。
我找到了解决此问题的两种方法。
第一个是一种解决方法,没有第二个那么整洁。
将B实体的主键定义为包含col_a,col_b和的复合键,col_c首先将假定为主键的内容定义为唯一约束。缺点是,从col_c概念上讲,该列实际上并不是主键的一部分。
B
col_a
col_b
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注释,并且恰好做了我一开始想要做的事情。
@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; }