java - 具有一部分复合主键的 Hibernate 外键

标签 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_acol_bcol_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;
}

关于java - 具有一部分复合主键的 Hibernate 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32625410/

相关文章:

java - QueryDsl 日期算术问题(PostgreSQL 落后)- 函数 add_minutes(...) 不存在

java - 创建 jar 文件的最简单方法?

java - Android:删除 ListView 中某些列表项的分隔符

java - Hibernate 使用 BigDecimal 而不是 Integer

Mysql跨库外键

java - 使用数组列表来指示另一个数组列表的索引

java - 检查 hibernate 映射类中的不变量

spring - @Transactional(readOnly = true) 导致 LazyInitializationException

sql - 一个外键可以引用多个表吗?

java - MySQLIntegrityConstraintViolationException : Cannot add or update a child row